【问题标题】:Model formsets and Date fields模型表单集和日期字段
【发布时间】:2009-05-18 17:15:03
【问题描述】:

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

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

这就是我初始化模型表单集的方式。

如何覆盖这些设置

【问题讨论】:

    标签: django datetime templates modelform


    【解决方案1】:

    执行此操作的常用方法是在 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_factory 构造函数。有点难以弄清楚,因为它没有在文档中明确说明......而是 Django 文档通过顺便提到模型表单集工厂扩展了正常的表单集工厂来暗示这种能力。每当我有疑问时,我都会打开 django/forms/models.py 来查看表单集工厂函数的完整签名。

    【讨论】:

    • 感谢您的回复,但是我忘了提到我正在使用 inlineformset 来初始化表单。我也编辑了这个问题。
    • 好答案。但是......“禁止”的意思是“禁止” - 我不认为这就是你的意思。也许“prescribed”更接近您正在寻找的意思。
    • HAHAHAHA...现在这是一个几乎值得留下的错字。
    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 2013-08-27
    • 1970-01-01
    • 2012-05-04
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多