Django AdminForm字段默认值
问题描述:
我有一个Django管理员窗体。 现在我想用基于我的模型的数据填充它的初始字段。所以,我想这一点:Django AdminForm字段默认值
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)
在这一点上,我不知道如何访问电子邮件字段来设置它的初始值小部件之前被渲染。我怎样才能做到这一点?
答
我不太清楚你需要设置电子邮件地址,但你可以在很多不同的地方设置初始值。
您的功能def init()没有正确缩进,我猜是一个错字?另外,你为什么要特别给电子邮件表格字段TextInput?它已经使这个小工具在默认情况下
可以在设置电子邮件的初始值窗体的初始化(高清__的init __(个体经营))
(self.fields['email'].widget).initial_value = "something"
或model.py
email = models.CharField(default="something")
或者你有forms.py
email = models.CharField(initial="something")
答
我需要第一个pastylegs的解决方案,因为其他人会覆盖整个Widget,例如帮助文本。但是,他发布它并不适合我。相反,我不得不这样做:
self.fields['email'].initial = 'something'
以我为例,我是想在Django管理形式的领域做一个个性化的自动增量(根据目前的数据,而不是一个简单的默认值)。
答
假设值基于 '请求' 您应该使用这样的:
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
答
由于Django的1.7存在的ModelAdmin函数get_changeform_initial_data
,设置初始形式值:
def get_changeform_initial_data(self, request):
return {'name': 'custom_initial_value'}
编辑:除此之外,@Paul Kenjora的答案无论如何都适用,如果您已经覆盖get_form
,这可能很有用。
如果是inline(InlineModelAdmin
),则不存在get_changeform_initial_data
。您可以覆盖get_formset
并设置formset.form.base_fields['my_field_name'].initial
。
如果您自然使用模型管理员的自定义窗体类 – ozgur 2016-12-26 15:13:54
@ozgur,它不起作用。如果您使用自定义表单类,则只需按照另一个答案中的建议使用'get_form'。如果不是,那绝对没有理由这样做。 – Wtower 2016-12-26 17:04:40
如果您提供初始值的字段通过'exclude'属性排除,因为'base_fields'不包含排除的字段,所以其他答案也不起作用。 – ozgur 2016-12-26 17:38:53