模型表单集和日期字段

时间:2009-05-18 17:15:04

标签: django datetime templates modelform

我在一个带有几个日期字段的模型上有一个模型formset - 这也是模型中的DateTimeField。 但是当它显示在模板中时,它显示为文本字段。 如何将其显示为下拉框?

WFormSet = inlineformset_factory(UserProfile, W, can_delete=False,exclude=[<list of fields to be excluded>], extra=3) 

这就是我初始化modelformset的方式。

如何覆盖这些设置

1 个答案:

答案 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工厂函数的完整签名。