如何让Django管理员的“另存为新”与只读字段一起使用?

问题描述 投票:0回答:1

我想在Django的管理员中为这样的模型实现“另存为新”功能:

class Plasmid (models.Model):
    name = models.CharField("Name", max_length = 255, blank=False)
    other_name = models.CharField("Other Name", max_length = 255, blank=True)
    selection = models.CharField("Selection", max_length = 50, blank=False)
    created_by = models.ForeignKey(User)

在管理员中,如果请求质粒对象的用户与创建它的用户不同,则上述某些字段将设置为只读。如果用户相同,则它们都是可编辑的。例如:

class PlasmidPage(admin.ModelAdmin):

    def get_readonly_fields(self, request, obj=None):

        if obj:
            if not request.user == obj.created_by:
                return ['name', 'created_by',]
            else:
                return ['created_by',]
        else:
            return []

    def change_view(self,request,object_id,extra_context=None):

        self.fields = ('name', 'other_name', 'selection', 'created_by',)
        return super(PlasmidPage,self).change_view(request,object_id)

我遇到的问题是,当一个字段是只读的并且用户点击“另存为新”按钮时,该字段的值不会“转移”到新对象。另一方面,传输非只读字段的值。

有人为什么,或者我如何解决这个问题?我想将只读和非只读字段的值传递给新对象。

django django-admin
1个回答
0
投票

你尝试过 Field.disabled属性吗?

禁用的boolean参数设置为True时,将使用禁用的HTML属性禁用表单字段,以便用户无法编辑它。即使用户篡改了提交给服务器的字段值,也会忽略该表单的初始数据中的值。

我在我的项目中做了一个快速测试。当我添加新条目时,已禁用的字段被发送到服务器。所以这样的事情对你有用:


class PlasmidPage(admin.ModelAdmin):

    def get_form(self, request, *args, **kwargs):
        form = super(PlasmidPage, self).get_form(request, *args, **kwargs)
        if not request.user == self.cleaned_data['created_by'].:
            form.base_fields['created_by'].disabled = True
            form.base_fields['name'].disabled = True

    def change_view(self,request,object_id,extra_context=None):

        self.fields = ('name', 'other_name', 'selection', 'created_by',)
        return super(PlasmidPage,self).change_view(request,object_id)

© www.soinside.com 2019 - 2024. All rights reserved.