【问题标题】:How to only accept date inputs of more than 18 years ago in Django如何在 Django 中只接受超过 18 年前的日期输入
【发布时间】:2020-12-03 13:10:15
【问题描述】:

我有一个表格,允许用户在他们的个人资料上更新他们的生日。我希望它仅在用户至少 18 岁时才有效。这是我尝试过的:

models.py

class Profile(models.Model):
    birthday = models.DateField()

forms.py

from django import forms
from datetime import datetime
from .models import Profile

class ProfileUpdateForm(forms.ModelForm):
    birthday = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}))

    def clean_birthday(self):
        dob = self.cleaned_data['birthday']
        age = (datetime.now() - dob).days / 365
        if age < 18:
            raise forms.ValidationError('You must be at least 18 years old')
        return dob

    class Meta:
        model = Profile
        fields = ('birthday',)

提交后我收到 TypeError unsupported operand type(s) for -: 'datetime.datetime' and 'datetime.date'

这是我的看法:

@login_required
def update_my_profile_view(request):
    profile = Profile.objects.get(user=request.user)
    form = ProfileUpdateForm(request.POST or None, instance=profile)

    if request.method == 'POST':
        if form.is_valid():
            form.save()

    return redirect('users:my_profile')

谁能解释一下我做错了什么?

【问题讨论】:

  • 错误非常简单:它表示您使用的类型与减法不兼容(操作数-):您正在尝试减去datedob ) 来自datetime (datetime.now())。 Python 不允许你这样做。

标签: django forms datetime datefield


【解决方案1】:

问题出在一行:
age = (datetime.now() - dob).days / 365

datetime.now() -> 返回一个datetime
dob -> 是一个date

所以,您要减去两种不同的数据类型!

from datetime import date
date.today()

这将只返回日期,您可以使用它来代替 datetime.now()

【讨论】:

  • 太好了,成功了!谢谢。虽然我现在有一个新问题。如果我提交的日期距今天不到 18 年,它根本不会显示日期,而不是像我希望的那样使表格无效
  • 很遗憾,我对 Django 不太熟悉。我回答了这个问题,因为这是一个一般的 python 错误!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
相关资源
最近更新 更多