模型表单集和日期字段

cra*_*kar 3 django datetime templates modelform

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

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

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

如何覆盖这些设置

Jar*_*die 6

通常的方法是覆盖 ModelForm定义中的默认字段类型.

如果你的模型中有一个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
Run Code Online (Sandbox Code Playgroud)

据我所知,没有为DateTimeFieldDjango 1.0.x 提供的等效小部件.在这种情况下,您将需要创建自定义窗口小部件,可能是子类SelectDateWidget.我从一个快速谷歌上SelectDateTimeWidget注意到,有几个人一直在制作看起来像你正在寻找的小部件.我没有使用它们,所以请注意,但是这样的SelectDateTimeWidget补丁可能是一个很好的起点.


编辑:使用ModelFormset或InlineModelFormset时,您仍然可以通过传递form=MyModelForminlineformet_factory函数来实现:

MyModelFormset = inlineformset_factory(MyParentModel, MyModel, form=MyModelForm)
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为两个模型formset工厂实际上formset_factory在它们自己的实现中调用常规构造函数.这有点难以弄清楚,因为它没有在文档中明确说明......而是Django文档通过提及模型formset工厂扩展了普通的formset_factory来提及这种能力.每当我有疑问时,我会打开django/forms/models.py以查看formset工厂功能的完整签名.