我在一个带有几个日期字段的模型上有一个模型formset - 这也是模型中的DateTimeField。 但是当它显示在模板中时,它显示为文本字段。 如何将其显示为下拉框?
WFormSet = inlineformset_factory(UserProfile, W, can_delete=False,exclude=[<list of fields to be excluded>], extra=3)
这就是我初始化modelformset的方式。
如何覆盖这些设置
答案 0 :(得分:6)
执行此操作的常用方法是在ModelForm定义中override the default field types。
如果你的模型中有一个DateField,那么下面的例子就可以了(我注意到你有一个DateTimeField ......我会在一秒内回到那里)。您将指定与通常指定的完全相同的字段类型,但是您将把不同的窗口小部件传递给表单字段构造函数。
from django.db import models
from django import forms
from django.forms.extras import SelectDateWidget
class MyModel(models.Model):
a_date_field = models.DateField()
class MyModelForm(forms.ModelForm):
a_date_field = forms.DateField(widget=SelectDateWidget())
class Meta:
model = MyModel
据我所知,没有为Django 1.0.x中的DateTimeField
提供的等效小部件。在这种情况下,您将需要创建自定义窗口小部件,可能是子类SelectDateWidget
。我在SelectDateTimeWidget
的快速谷歌上注意到,还有其他几个人正在制作看起来像你正在寻找的小部件。我没有使用它们,所以请注意this SelectDateTimeWidget patch这样的事情可能是一个很好的起点。
编辑:使用ModelFormset或InlineModelFormset时,您仍然可以通过将form=MyModelForm
传递给inlineformet_factory
函数来实现此目的:
MyModelFormset = inlineformset_factory(MyParentModel, MyModel, form=MyModelForm)
这是有效的,因为两个模型formset工厂实际上在他们自己的实现中调用常规formset_factory
构造函数。这有点难以弄清楚,因为它没有在文档中明确说明......而是Django文档通过提及模型formset工厂扩展了普通的formset_factory来提及这种能力。每当我有疑问时,我都会打开django/forms/models.py
来查看formset工厂函数的完整签名。