首页 > 解决方案 > Django UpdateForm DateInput 小部件不显示日期

问题描述

我正在使用 DateInput 小部件在输入日期字段时提供日期选择器。但是,在我的更新表单中,该表单会提取该记录的所有数据,日期除外,显示为:

dd/mm/yyy

如何获取已输入的日期以显示“models.py

class Project(models.Model):
    '''
    Main Project, serves the default Projects Portal window.
    '''
    published = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
    area = models.ForeignKey(
        Area,
        related_name="project",
        on_delete=models.PROTECT
        )
    title = models.CharField(max_length=128, unique=True)
    slug = models.SlugField(max_length=64)
    summary = models.CharField(max_length=256)
    others = models.CharField(max_length=128, blank=True)
    staff_trials = models.DateField(null=True, blank=True)
    deadline = models.DateField()
    slip = models.BooleanField(default=False)

    class Meta:
        ordering = ["-slip", "deadline"]

    def __str__(self):
        return self.title

表格.py

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

class ProjectModelForm(forms.ModelForm):
    """
    Form used for creating and editing projects. Authenticated User
    required to be signed in.
    """
    title = forms.CharField(widget=forms.Textarea)
    summary = forms.CharField(widget=forms.Textarea)

    class Meta:
        model = Project
        fields = (
            'title',
            'summary',
            'others',
            'staff_trials',
            'deadline',
            'area',
        )
        widgets = {
            'staff_trials': DateInput(),
            'deadline': DateInput(),
        }

视图.py

class ProjectEditView(UpdateView):
    template_name = 'project_portal/project_detail.html'
    form_class = ProjectModelForm
    queryset = Project.objects.all()

    def form_valid(self, form):
        user = self.request.user
        form.instance.user = user
        print(form.cleaned_data)
        return super().form_valid(form)

    def get_object(self):
        slug_ = self.kwargs.get("slug")
        return get_object_or_404(Project, slug=slug_)

标签: djangodjango-formsdjango-widget

解决方案


你不应该再次定义titleand summary。如果您想要一个文本区域小部件,只需在Meta表单的一部分中指定它,它会更干净。我认为forms.DateInput在您的情况下覆盖默认值没有用。

class ProjectModelForm(forms.ModelForm):
    class Meta:
        model = Project
        fields = (
            'title',
            'summary',
            'others',
            'staff_trials',
            'deadline',
            'area',
        )
        widgets = {
            'title': forms.Textarea(),
            'summary': forms.Textarea(),
            'staff_trials': forms.DateInput(),
            'deadline': forms.DateInput(),
        }

最后,您确定好对象正在用于您的更新视图吗?字段titlesummary是预期的吗?


编辑:另一种解决方案,带有django-tempus-dominus包,非常有用并且带有漂亮的小部件。

安装小部件

pip install django-tempus-dominus

然后,将应用程序添加tempus_dominus到您的INSTALLED_APPS设置中。

在表单中使用小部件

# forms.py

from tempus_dominus.widgets import DatePicker
class ProjectModelForm(forms.ModelForm):
    class Meta:
        model = Project
        fields = [
            'title',
            'summary',
            'others',
            'staff_trials',
            'deadline',
            'area',
        ]
        widgets = {
            'deadline': DatePicker(
                options={
                    'format': 'DD/MM/YYYY'
                },
                attrs={
                    'prepend': 'fa fa-calendar',
                },
            )
        }

DatePicker您可以为您的小部件添加很多选项,例如查看此处此处

更新您的模板

只需添加{{ form.media }}用于显示您的日期的模板。要显示日期,您无需更改任何内容:{{ form.deadline }}

注意:如果需要,不要忘记添加缺少的资源!像 jQuery、Bootstrap4 一样...只需查看<head></head>文档中指定的资源即可。

实际例子(我自己的配置)

例如,这是我这样做的方法,任何日期都只能通过点击来设置(用户不能在日期输入中键入):

# forms.py

import datetime
from allauth.account.forms import SignupForm
from django import forms
from django.utils.translation import ugettext_lazy as _
from tempus_dominus.widgets import DatePicker

sixteen_years_ago = datetime.date.today() - datetime.timedelta(days=16*365.24)
common_options_for_datetimepicker = {
    'icons': {
        'time': 'far fa-clock',
        'date': 'far calendar-alt',
        'up': 'fas fa-arrow-circle-up',
        'down': 'fas fa-arrow-circle-down',
        'previous': 'far fa-arrow-alt-circle-left fa-lg',
        'next': 'far fa-arrow-alt-circle-right fa-lg',
    },
    'widgetPositioning': {
        'vertical': 'bottom',
        'horizontal': 'left'
    },
    'ignoreReadonly': True,
}

class Signup_MixinForm(SignupForm):
    class Meta:
        abstract = True

class SignupRegular_Form(Signup_MixinForm):
    birth_date = forms.DateField(
        required=True,
        initial=sixteen_years_ago,
        widget=DatePicker(
            options={
                **common_options_for_datetimepicker,
                'format': 'D/MM/YYYY',
                'maxDate': sixteen_years_ago.strftime('%Y-%m-%d')
            },
            attrs={
                'prepend': 'fa fa-calendar',
                'size': 'large',
                'placeholder': _("Your birth date"),
                'readonly': 'readonly'
            },
        ),
    )

推荐阅读