【问题标题】:Django AdminForm field default valueDjango AdminForm 字段默认值
【发布时间】:2011-09-04 02:52:30
【问题描述】:

我有一个 Django 管理表单。 现在我想用基于我的模型的数据填充它的初始字段。所以我尝试了这个:

class OrderForm(forms.ModelForm):
    class Meta:
        model = Order

    email = CharField(initial="null", widget=Textarea(attrs={'rows': 30, 'cols': 100}))

    def __init__(self, *args, **kwargs):

        self.request = kwargs.pop('request', None)

        products = kwargs['instance'].products.all()

        self.message = purchase_message % (
            "".join(["<li>" + p.name + ": " + str(p.price) + "</li>" for p in products]),
            reduce(lambda x, y:x + y.price, products, 0)
        )

        # and here I have a message in self.message variable

        super(OrderForm, self).__init__(*args, **kwargs)

此时我不知道如何在小部件呈现之前访问电子邮件字段以设置其初始值。我该怎么做?

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    假设值是基于“请求”,你应该使用这个:

    class MyModelAdmin(admin.ModelAdmin):
        def get_form(self, request, obj=None, **kwargs):
            form = super(MyModelAdmin, self).get_form(request, obj, **kwargs)
            form.base_fields['my_field_name'].initial = 'abcd'
            return form
    

    【讨论】:

      【解决方案2】:

      从 Django 1.7 开始,ModelAdmin 中有一个函数 get_changeform_initial_data 用于设置初始表单值:

      def get_changeform_initial_data(self, request):
          return {'name': 'custom_initial_value'}
      

      编辑:除此之外,@Paul Kenjora 的答案仍然适用,如果您已经覆盖 get_form,这可能会很有用。

      如果是内联 (InlineModelAdmin),则没有 get_changeform_initial_data。您可以覆盖get_formset 并设置formset.form.base_fields['my_field_name'].initial

      【讨论】:

      • 如果你为模型管理员使用自定义表单类,它不起作用
      • @ozgur 自然。如果您使用自定义表单类,则只需按照另一个答案中的建议使用 get_form。如果不是,那么绝对没有理由这样做。
      • 如果您提供初始值的字段通过exclude 属性排除在外,则其他答案也不起作用,因为base_fields 不包含排除字段。
      • 谢谢,这对我有帮助。很多其他帖子都有更复杂的方法来做到这一点。
      • 请注意,get_changeform_initial_data() 仅在添加新对象时调用,而不是在更改现有对象时调用。请参阅source (Django 3.2)。
      【解决方案3】:

      我不太确定您需要将电子邮件设置为什么,但您可以在许多不同的地方设置初始值。

      你的函数 def init() 没有正确缩进,我猜是错字?另外,您为什么要专门为电子邮件表单字段提供 TextInput?它已经默认渲染了这个小部件

      您可以在表单的初始化(def __ init __(self))中设置电子邮件的初始值

      (self.fields['email'].widget).initial_value = "something"
      

      或者在model.py中

      email = models.CharField(default="something")
      

      或者像你在 forms.py 中的那样

      email = models.CharField(initial="something")
      

      【讨论】:

        【解决方案4】:

        我需要pastylegs 的第一个解决方案,因为其他的会覆盖整个小部件,包括帮助文本。但是,当他发布它时,它对我不起作用。相反,我必须这样做:

        self.fields['email'].initial = 'something'
        

        就我而言,我试图在 django 管理表单的字段中进行个性化的自动增量(基于当前数据而不是简单的默认值)。

        【讨论】:

          【解决方案5】:

          此代码适用于我(Django 1.11):

          from django import forms
          
          class MyAdminForm(forms.ModelForm):
              def __init__(self, *args, **kwargs):
                  super().__init__(*args, **kwargs)
                  self.initial['field_name'] = 'initial_value'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-04-11
            • 1970-01-01
            • 2016-12-28
            • 1970-01-01
            • 2010-10-19
            • 2018-09-26
            • 2017-01-28
            相关资源
            最近更新 更多