【问题标题】:Swap the field type/widget rendered in AdminPage depending on the permissions根据权限交换在 AdminPage 中呈现的字段类型/小部件
【发布时间】:2012-02-15 04:25:55
【问题描述】:

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

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

有可能吗?

【问题讨论】:

    标签: python django django-admin django-modeladmin


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      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 的答案更合适,但如果您需要做比这更复杂的事情,这种方法就是要走的路。

      【讨论】:

        猜你喜欢
        • 2020-02-21
        • 1970-01-01
        • 1970-01-01
        • 2022-10-12
        • 1970-01-01
        • 2021-12-19
        • 1970-01-01
        • 1970-01-01
        • 2011-03-29
        相关资源
        最近更新 更多