Django 表单验证:必填字段在空白时不显示错误
Django form validation: required fields not displaying errors when blank
我正在尝试使用一些简单的验证规则构建一个简单的表单。
我遇到的问题是,当我尝试提交表单时,本应必填的字段没有导致任何验证提示出现在表单页面中。比如,当我提交一个完全空白的表单时,我会被重定向到我指定的页面,而不是出现任何验证错误提示。
虽然表单实际上没有任何数据到数据库,所以看起来 is_valid 函数工作正常,如果我在应该是整数的地方输入一个字符串,我会收到错误消息.所以我想知道您通常是否需要做一些额外的编码才能显示一些 'field required' 消息。目前我让 Django 负责所有验证,我没有创建任何自定义规则。这是一些代码:
模特
class Advert(models.Model):
user = models.ForeignKey(User)
category = models.ForeignKey('Category')
title = models.CharField(max_length=100, null=False, blank=False)
description = models.TextField()
price = models.IntegerField(null=False, blank=False)
image = models.FileField(upload_to=get_upload_file_name, null=True)
location = models.CharField(max_length=50, null=False, blank=False)
pub_date = models.DateField(auto_now_add=True)
我想指出的是,在将这些添加到模型后,makemigrations 没有检测到更改,但我认为它假设在未明确指定时 null=False?并且在 ModelForm 中,也假定 required=True no?
形式
class AdvertForm(forms.ModelForm):
class Meta:
model = Advert
exclude = ['user']
查看文件
def create_advert(request):
if request.POST:
form = AdvertForm(request.POST, request.FILES)
if form.is_valid():
ad = form.save(False)
ad.user = request.user
ad.save()
return HttpResponseRedirect('/adverts/list_adverts/0/')
else:
c = {}
c.update(csrf(request))
c['form'] = AdvertForm()
return render(request, 'create_advert.html', c)
所以 is_valid 工作正常,记录未保存,但我没有收到将必填字段留空的错误提示。
我有什么遗漏吗?
因为即使表单无效,您也会进行重定向。相反,您应该停留在同一个视图上并重新呈现表单。视图应如下所示:
def create_advert(request):
if request.POST:
form = AdvertForm(request.POST, request.FILES)
if form.is_valid():
ad = form.save(commit=False)
ad.user = request.user
ad.save()
return HttpResponseRedirect('/adverts/list_adverts/0/')
else:
form = AdvertForm()
return render(request, 'create_advert.html', {'form': form})
(请注意,手动添加 CSRF 令牌没有意义,上下文处理器会这样做,因为您使用的是 render
快捷方式。)
我正在尝试使用一些简单的验证规则构建一个简单的表单。
我遇到的问题是,当我尝试提交表单时,本应必填的字段没有导致任何验证提示出现在表单页面中。比如,当我提交一个完全空白的表单时,我会被重定向到我指定的页面,而不是出现任何验证错误提示。
虽然表单实际上没有任何数据到数据库,所以看起来 is_valid 函数工作正常,如果我在应该是整数的地方输入一个字符串,我会收到错误消息.所以我想知道您通常是否需要做一些额外的编码才能显示一些 'field required' 消息。目前我让 Django 负责所有验证,我没有创建任何自定义规则。这是一些代码:
模特
class Advert(models.Model):
user = models.ForeignKey(User)
category = models.ForeignKey('Category')
title = models.CharField(max_length=100, null=False, blank=False)
description = models.TextField()
price = models.IntegerField(null=False, blank=False)
image = models.FileField(upload_to=get_upload_file_name, null=True)
location = models.CharField(max_length=50, null=False, blank=False)
pub_date = models.DateField(auto_now_add=True)
我想指出的是,在将这些添加到模型后,makemigrations 没有检测到更改,但我认为它假设在未明确指定时 null=False?并且在 ModelForm 中,也假定 required=True no?
形式
class AdvertForm(forms.ModelForm):
class Meta:
model = Advert
exclude = ['user']
查看文件
def create_advert(request):
if request.POST:
form = AdvertForm(request.POST, request.FILES)
if form.is_valid():
ad = form.save(False)
ad.user = request.user
ad.save()
return HttpResponseRedirect('/adverts/list_adverts/0/')
else:
c = {}
c.update(csrf(request))
c['form'] = AdvertForm()
return render(request, 'create_advert.html', c)
所以 is_valid 工作正常,记录未保存,但我没有收到将必填字段留空的错误提示。
我有什么遗漏吗?
因为即使表单无效,您也会进行重定向。相反,您应该停留在同一个视图上并重新呈现表单。视图应如下所示:
def create_advert(request):
if request.POST:
form = AdvertForm(request.POST, request.FILES)
if form.is_valid():
ad = form.save(commit=False)
ad.user = request.user
ad.save()
return HttpResponseRedirect('/adverts/list_adverts/0/')
else:
form = AdvertForm()
return render(request, 'create_advert.html', {'form': form})
(请注意,手动添加 CSRF 令牌没有意义,上下文处理器会这样做,因为您使用的是 render
快捷方式。)