Django AdminForm字段默认值

bar*_*tek 16 django django-admin

我有一个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)
Run Code Online (Sandbox Code Playgroud)

此时我不知道如何访问电子邮件字段以在呈现窗口小部件之前设置它的初始值.我怎样才能做到这一点?

Pau*_*ora 50

假设该值基于'request',您应该使用:

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
Run Code Online (Sandbox Code Playgroud)


Wto*_*wer 24

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

def get_changeform_initial_data(self, request):
    return {'name': 'custom_initial_value'}
Run Code Online (Sandbox Code Playgroud)

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

如果是inline(InlineModelAdmin)则没有get_changeform_initial_data.您可以覆盖get_formset和设置formset.form.base_fields['my_field_name'].initial.

  • 谢谢,这对我有帮助。因此,许多其他帖子都采用了更为复杂的方法。 (2认同)

Tim*_*ony 6

我不太确定你需要设置电子邮件,但是你可以在很多不同的地方设置初始值.

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

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

(self.fields['email'].widget).initial_value = "something"
Run Code Online (Sandbox Code Playgroud)

或者在model.py中

email = models.CharField(default="something")
Run Code Online (Sandbox Code Playgroud)

或者就像你在forms.py中一样

email = models.CharField(initial="something")
Run Code Online (Sandbox Code Playgroud)


tot*_*ico 6

我需要第一个 Pastylegs 解决方案,因为其他解决方案覆盖了整个 Widget,例如,帮助文本。但是,当他发布时,它对我不起作用。相反,我必须这样做:

self.fields['email'].initial = 'something'
Run Code Online (Sandbox Code Playgroud)

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