【问题标题】:How to use can_add_related in Django Admin如何在 Django Admin 中使用 can_add_related
【发布时间】:2012-05-09 19:06:22
【问题描述】:

我在这里阅读了有关 can_add_related 功能:https://code.djangoproject.com/ticket/9071

我试过这样使用它:

def get_form(self, request, obj=None, **kwargs):
    self.fields['person'].can_add_related = False
    return super(OperationAdmin, self).get_form(request, obj, **kwargs)

但这会引发 TypeError,我不知道如何解决。

有人能指出正确的方向吗?

谢谢。

【问题讨论】:

标签: python django django-admin


【解决方案1】:

这可能来晚了。但供其他观众参考,

def get_form(self, request, obj=None, **kwargs):
    form = super(ProductAdmin, self).get_form(request, obj, **kwargs)
    form.base_fields['category'].widget.can_add_related = False
    return form

【讨论】:

  • 对于所有尝试这样做的人来说,这很有效,即使使用 Django 1.7 - 不适用于内联。对于他们,我最终覆盖了小部件,正如 @Seether 所解释的,请参见此处:link
  • 查看@normic 评论中链接的问题的答案,以获得更简洁的内联解决方案(使用 get_formset 而不是 get_form)stackoverflow.com/a/37558444/1302095
【解决方案2】:

can_add_related好像是an attribute on the widget,不是字段,所以试试:

self.fields['person'].widget.can_add_related = False

【讨论】:

    【解决方案3】:

    另一种方法,在实例化表单之前*更改小部件选项:

    class MyAdmin(django.contrib.admin.ModelAdmin):
    
        def formfield_for_dbfield(self, *args, **kwargs):
            formfield = super().formfield_for_dbfield(*args, **kwargs)
            if hasattr(formfield, "widget"):
                formfield.widget.can_add_related = False
                formfield.widget.can_delete_related = False
                formfield.widget.can_change_related = False
            else:
                pass  # this relation doesn't have an admin page to add/delete/change
    
            return formfield
    

    【讨论】:

      【解决方案4】:

      如果您要定义内联模型并在管理员中使用它,另一种方法是 overwrite the get_formset 方法:

      from django.contrib import admin
      
      
      class MyModelInline(admin.TabularInline):
          model = MyModel
          extra = 0
          min_num = 1
          max_num = 10
          fields = [
              'some_field'
          ]
      
          def get_formset(self, request, obj=None, **kwargs):
              fs = super().get_formset(request, obj, **kwargs)
              fs.form.base_fields['some_field'].widget.can_add_related = False
              fs.form.base_fields['some_field'].widget.can_change_related = False
              fs.form.base_fields['some_field'].widget.can_delete_related = False
              return fs
      

      【讨论】:

        猜你喜欢
        • 2018-06-05
        • 2021-03-24
        • 2022-12-14
        • 2019-05-21
        • 1970-01-01
        • 1970-01-01
        • 2010-12-31
        • 2012-04-13
        • 2011-10-17
        相关资源
        最近更新 更多