Django:表单验证 - 日期不是过去的,用户唯一的日期

Django: form validation - date not past and date for user unique

我在 Django 中定义表单时遇到问题(python 3.7,django 3.0.8)

我创建了一个模型。这个模型有两个非常重要的字段:日期和user_id.

要求:日期和user_id是唯一的。

我创建了一个与模型关联的表单模型。登录用户填写表单,重要的是定义的日期不能来自过去,也不能出现在数据库中。

我的问题:

一个问题: 我与过去日期相关的验证工作正确[!],但如果给出了过去的日期,则不会显示错误消息。

第二个问题:第二个问题是我不知道如何防止定义数据,它存在于数据库中。

代码:models.py

class MyModel(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    date = models.DateField()
    ...(other fields)

    class Meta:
        unique_together = [['user', 'date']]

代码:forms.py

class AddMyModel(forms.Form):
    date = forms.DateField(widget=DateInput(attrs={'type': 'date'}),
                           )
    def clean_date(self):
        date = self.cleaned_data['date']
        if date < timezone.now().date():
            raise ValidationError("Date cannot be in the past")


        return date

您是否知道如何设计表单以在模板中显示错误“日期不能来自过去”和错误“给定日期已定义”?

views.py

def add(request):
    if request.user.is_authenticated:
        user = request.user.id

        if request.method == 'POST':
            form = AddMyModel(request.POST)
            if form.is_valid():
                date = form['date'].value()
                mymodel= MyModel(user=User(pk=user), date=date)
                mymodel.save()
                return render(request, 'mysite/successfuladd.html', {"login": True})
        form = AddMyModel()
        return render(request, 'mysite/add.html', {'form': form, 'login': True})
    else:
        return render(request, 'mysite/homepage.html', {'login': False})

用日期时间试试这个:

def clean_date(self):
    date = self.cleaned_data['date']
    if date < datetime.date.today():
        raise ValidationError(self.error_messages['Date cannot be in the past'], code='Date cannot be in the past')
    return date

我自己设法解决了这个问题。 我的模型也是一样。

forms.py

class AddMyModel(forms.ModelForm):
    def clean_date(self):
        date = self.cleaned_data['date']
        if date < timezone.now().date():
            raise forms.ValidationError(message='Date cannot be in the past')
        return date

    class Meta:
        model = MyModel
        fields = ('date')
        widgets = {
            'date': forms.DateInput(attrs={'type': 'date'})
        }

views.py

def add(request):
    if request.user.is_authenticated:
        user = request.user.id
        if request.method == 'POST':
            form = AddMyModel(request.POST)
            if form.is_valid():
                date = form['date'].value()
                if MyModel(user=User(pk=user), date=date):
                    unique_error = "User and date is already exist."
                    return render(request, 'mysite/add.html',
                                  {'form': form, 'login': True, 'unique_error': unique_error})
                else:
                    mymodel= MyModel(user=User(pk=user), date=date)
                    mymodel.save()
                    return render(request, 'mysite/successfuladd.html', {"login": True})
            return render(request, 'mysite/add.html',
                          {'form': form, 'login': True})
        form = AddMyModel()
        return render(request, 'mysite/add.html', {'form': form, 'login': True})
    else:
        return render(request, 'mysite/homepage.html', {'login': False})