【问题标题】:Django Forms - Custom Date InputDjango 表单 - 自定义日期输入
【发布时间】:2017-10-04 13:50:25
【问题描述】:

我在通过以下表格清除日期时遇到问题:

class CreateArtistProfile(forms.ModelForm):
    focus_str = forms.CharField()
    birthdate = forms.DateField(input_formats="%d %B, %Y")
    occupation = forms.CharField(required=False)
    tagline = forms.CharField(required=False)

    class Meta:
        model=ArtistAccount
        fields = ['artist_name', 'location', 'occupation', "type_label", "map_input", "tagline", "birthdate"]

我正在使用 Materialize 的日期选择器,并尝试提交它给我的日期字符串。如果我选择一个日期,字段值如下所示

2004 年 9 月 30 日

但 Django 继续拒绝它:

('birthdate', '请输入有效日期。')

我想我已经设置了correct date formats。我做错了什么吗?在清理过程之前是否有不同的方法来调整 Django 的格式期望?

【问题讨论】:

  • 我已经更新了我的答案,如有任何问题请告诉我

标签: django django-forms


【解决方案1】:

为生日字段添加widgets

birthdate 应该是模型 ArtistAccount 的 models.DateField

class CreateArtistProfile(forms.ModelForm):
    focus_str = forms.CharField()
    occupation = forms.CharField(required=False)
    tagline = forms.CharField(required=False)

    class Meta:
        model=ArtistAccount
        fields = ['artist_name', 'location', 'occupation', "type_label", "map_input", "tagline", "birthdate"]
        widgets = {
           'birthdate': forms.DateInput(format=('%d %B, %Y'), attrs={'class': 'datepicker'}),
        }

【讨论】:

  • 不幸的是,这仍然无法正常工作。我认为它在cleaned_data() 上被绊倒了。我不应该在数据被清理之前提取数据吗?我认为这是为了在清洁后做额外的工作。
【解决方案2】:

我不知道如何通过 Django 的表单获取自定义日期。希望有人可以发布答案,但现在,这是我的解决方法:

首先,我从所需的模型字段中删除了“生日”并将其转换为 CharField:

class CreateArtistProfile(forms.ModelForm):
    focus_str = forms.CharField()
    birthdate = forms.CharField()
    occupation = forms.CharField(required=False)
    tagline = forms.CharField(required=False)

    class Meta:
        model=ArtistAccount
        fields = ['artist_name', 'location', 'occupation', "type_label", "map_input", "tagline"]

然后在我看来我添加了一些额外的处理:

@require_POST
def create_artist_profile(request):
    if request.method == 'POST':
        form = forms.CreateArtistProfile(request.POST)
        if form.is_valid():
            string = request.POST["birthdate"]
            birthdate = datetime.strptime(string, "%d %B, %Y")
            form.instance.birthdate = birthdate
            form.save()
            json_obj = {"success": True}
            return JsonResponse(json_obj)
        else:
            return JsonResponse({'success': False, 'errors': [(k, v[0]) for k, v in form.errors.items()]})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多