我在Django(python 3.7,Django 3.0.8(中定义表单时遇到问题
我创建了一个模型。这个模型有两个非常重要的字段:date和user_id。
要求:date和user_id是唯一的。
我创建了一个表单模型以与该模型关联。登录用户完成表单,重要的是定义的日期不能是过去的,也不能出现在数据库中。
我的问题:
一个问题:我的验证与过去WORKS CORRECT[!]的日期关联,但如果给定了过去的日期,则不会显示错误消息。
第二个问题:第二件事是我不知道如何阻止定义数据,它存在于数据库中。
代码: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
我自己设法解决了这个问题。MyModels也是如此。
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})