为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

GCT1015 2023-04-18 14:25:05
我在 Django 中定义表单时遇到问题(python 3.7,django 3.0.8)我创建了一个模型。这个模型有两个非常重要的字段:date 和 user_id。要求:date和user_id是唯一的。我创建了一个与模型关联的表单模型。登录用户填写表格,重要的是定义的日期不能是过去的,也不能出现在数据库中。我的问题:一个问题:我的验证与过去的日期相关联 WORKS CORRECT[!],但如果给出了过去的日期,则不会显示任何错误消息。第二个问题:第二件事是我不知道如何防止定义数据,它存在于数据库中。代码:模型.pyclass MyModel(models.Model):    user = models.ForeignKey(User, on_delete=models.CASCADE)    date = models.DateField()    ...(other fields)    class Meta:        unique_together = [['user', 'date']]代码:forms.pyclass 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.pydef 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})
查看完整描述

2 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

用日期时间试试这个:


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


查看完整回答
反对 回复 2023-04-18
?
jeck猫

TA贡献1909条经验 获得超7个赞

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


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})


查看完整回答
反对 回复 2023-04-18
  • 2 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信