Django 小部件和日期字段

Posted

技术标签:

【中文标题】Django 小部件和日期字段【英文标题】:Django widgets and date fields 【发布时间】:2021-08-06 04:52:39 【问题描述】:

在我的创建模板中,日期字段呈现为 CharField 并且不允许选择日期,而我需要此验证日期。

我的模型包含一个 DateField :

class Interview(models.Model):
     date_planned = models.DateField(verbose_name="Planned Date", blank=True, null=True)

我的视图调用 ModelForm 很正常:

class InterviewCreateView(UserAccessMixin, CreateView):
    permission_required = "interviews.add_interview"
    model = Interview
    form_class = InterviewForm
    fields = ['date_planned', 'topics']
    template_name = "interviews/interview_create_form.html"
    success_url = reverse_lazy("interviews:interviews_list")
    ```
 My Form just calls the Meta and includes a widget:

类 InterviewForm(ModelForm): def init(self, *args, **kwargs): super().init(*args, **kwargs) self.fields['date_planned'].widget.attrs.update('size': 40, 'type': 'date')

class Meta:
    model = Interview
    fields=['topics', 'date_planned']```

确实,输入字段的大小达到了 40,但是系统忽略了日期格式,并让我的 date_planned 字段显示为 CharField

【问题讨论】:

你有什么问题? 我的问题是 DateInput 在处理表单时被简单地忽略了,在模板中我只有一个“文本”类型的字段,而不是“日期”。 Dosbodoke 的回答效果很好。 很高兴您得到了所需的帮助。为了将来参考,您应该直接提出问题以获得您需要的帮助。您的评论“我的问题是......”实际上仍然没有提出问题。 【参考方案1】:

在你的forms.py中你可以创建一个类

class DateInput(forms.DateInput):
    input_type = 'date'

class Meta:
   model = Interview
   fields = ['topics', 'date_planned']
   widgets = 'date_planned': DateInput(),

应该可以,除非是 DatePicker 问题。

【讨论】:

谢谢。您的直截了当的回答提供了一个直接可行的解决方案。【参考方案2】:

感谢 Dosbodoke,完整的答案应该如下所示:

class DateInput(forms.DateInput):
    input_type = "date"

class InterviewForm(ModelForm):
    class Meta:
        model = Interview
        fields = ['topics', 'date_planned']
        widgets = 'date_planned': DateInput(),

【讨论】:

以上是关于Django 小部件和日期字段的主要内容,如果未能解决你的问题,请参考以下文章

以自定义形式使用 Django 时间/日期小部件

如何将日期/日历小部件添加到 django 表单?

Django:如何检查自定义小部件定义中是不是存在字段错误?

Django Admin:仅对一个模型字段使用自定义小部件

Django:如何更改内联表单集中的字段小部件

django admin如何在只读字段上显示小部件