【问题标题】:change model admin form default value更改模型管理表单默认值
【发布时间】:2012-06-21 18:36:42
【问题描述】:

我的项目中有典型的模型继承:

class A(models.Model):
    boolean_field = models.BooleanField(default=True)

class B(A):
    some_other_field = models.CharField()

我想覆盖B类中boolean_field的默认值,我该怎么做?

我认为在数据库层上做这件事可能很棘手,所以至少我可以在 Django admin 中简单地覆盖该默认值(我的意思是在 B 类的 ModelAdmin 表单中)。

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    正如你所建议的,我认为最简单的方法是在 django admin 中更改用于 B 模型的模型表单。

    要更改表单字段的初始值,您可以重新定义该字段,或覆盖__init__ 方法。

    class BForm(forms.ModelForm):
        # either redefine the boolean field
        boolean_field = models.BooleanField(initial=False)
    
        class Meta:
            model = B
    
        # or override the __init__ method and set initial=False
        # this is a bit more complicated but less repetitive
        def __init__(self, *args, **kwargs):
            super(BForm, self).__init__(*args, **kwargs)
            self.fields['boolean_field'].initial = False
    

    在 django admin 中使用您的自定义模型表单很容易!

    class BAdmin(admin.ModelAdmin):
        form = BForm
    
    admin.site.register(B, BAdmin)
    

    【讨论】:

    • __init__ 的方式更好,因此模型中的字段可以更改,而无需在模型表单中手动反映这些更改,因为只更改了一个参数。
    【解决方案2】:
    class A(models.Model):
        boolean_field = models.BooleanField(default=True)
        def __unicode__(self):
            return self. boolean_field 
    
    
    class B():
        some_other_field = models.CharField()
        default_fiel_from_bool = models.ForeignKey(A)
    

    【讨论】:

      【解决方案3】:

      this answer,我发现最简单的方法是覆盖函数get_changeform_initial_data

      这是我将它应用到我的项目的方法。

      在此示例中,我有一个名为 Step 的 ORM 类和一个名为 StepAdmin 的 Admin 类。函数get_latest_step_order 从表中的最新对象中获取step_order

      通过覆盖管理类中的get_changeform_initial_data 函数,我可以为管理屏幕中创建的每个新对象设置步骤顺序。

      class Step(models.Model):
          step_name = models.CharField(max_length=200)
          step_status = models.ForeignKey(StepStatus, null=True)
          step_order = models.IntegerField()
      
      
      def get_latest_step_order():
          return Step.objects.latest('step_order').step_order+1
      
      class StepAdmin(admin.ModelAdmin):
          fields = ["step_name","step_status","step_order"]
      
          def get_changeform_initial_data(self, request):
              return {
                  'step_order': get_latest_step_order()
              }
      

      【讨论】:

      • 我对此做的唯一更新是首先调用超级函数来获取其他值的主要默认字典。比如:defaults = super().get_changeform_initial_data(request)defaults['step_order'] = get_latest_step_order()
      猜你喜欢
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多