0

就像在标题中一样,我想将呈现在表单上的字段交换。例如我有以下模型:

models.py
class Project(models.Model):
    name = models.TextField(max_length=200)
    finished = models.BoolenField(default=False)

admin.py
class ProjectAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        if request.user.is_superuser:
            #here change the name field form TextField 
            #to a disabled TextField or to other Field defined by me
            self.form['name']['widget] = MySuperDuperWidgetField() #or smth like that

可能吗?

4

2 回答 2

1

是的,这是可能的,但不像你有它:

class ProjectAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        ModelForm = super(ProjectAdmin, self).get_form(request, obj=None, **kwargs)
        class PermissionedModelForm(ModelForm):
            def __init__(self, *args, **kwargs):
                super(PermissionedModelForm, self).__init__(*args, **kwargs)

                if request.user.is_superuser:
                    self.fields['name'].widget = MySuperDuperWidgetField()

        return PermissionedModelForm

编辑

实际上对于像更改字段的小部件@IanClelland 的答案这样简单的事情更合适,但是如果您需要做比这更复杂的事情,这种方法就是要走的路。

于 2012-01-20T16:08:59.933 回答
1

您必须覆盖 ModelAdmin 子类中的 formfield_for_dbfield 方法。在其中,您可以检查请求、当前用户和对象实例,并确定要使用的正确表单域(使用您需要的任何自定义小部件)

(formfield_for_dbfield 未记录,因此风险自负:))如果您知道相关字段是外键、m2m 或选择字段,则有记录的方法可以覆盖这些字段。

于 2012-01-20T16:07:13.767 回答