我有一个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)
此时我不知道如何访问电子邮件字段以在呈现窗口小部件之前设置它的初始值。我怎么能这样做?
答案 0 :(得分:47)
假设该值基于'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
答案 1 :(得分:22)
从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
。
答案 2 :(得分:6)
我不太确定您需要将电子邮件设置为什么,但您可以在许多不同的地方设置初始值。
您的函数 def init()没有正确缩进,我猜这是一个拼写错误?另外,为什么要专门给电子邮件表单字段 TextInput ?它已默认呈现此小部件
您可以在表单初始化时设置电子邮件的初始值( def __ init __(自我))
(self.fields['email'].widget).initial_value = "something"
或在model.py
中email = models.CharField(default="something")
或在forms.py
中email = models.CharField(initial="something")
答案 3 :(得分:4)
我需要第一个pastylegs解决方案,因为其他的覆盖整个Widget包括,例如,帮助文本。然而,当他发布它时,它对我不起作用。相反,我必须这样做:
self.fields['email'].initial = 'something'
就我而言,我试图在django管理表单的字段中进行个性化的自动增量(基于当前数据而不是简单的默认值)。
答案 4 :(得分:3)
此代码适用于我(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'