Python Django表单验证:必填字段为空时不显示错误

Python Django表单验证:必填字段为空时不显示错误,python,django,django-forms,django-validation,Python,Django,Django Forms,Django Validation,我试图用一些简单的验证规则构建一个简单的表单 我遇到的问题是,当我尝试提交表单时,应该是必需的字段不会导致任何验证提示出现在表单页面中。就像在中一样,当我提交一个完全空白的表单时,我会被重定向到我指定的页面,而不会出现任何有效性错误提示 不过,表单实际上没有任何数据发送到数据库,因此看起来is_valid函数工作正常,如果我输入一个整数应该是的字符串,我会收到错误消息ok。所以我想知道你是否通常需要做一些额外的编码来显示一些“需要字段”的消息。目前,我让django负责所有的验证,而不是创建任何

我试图用一些简单的验证规则构建一个简单的表单

我遇到的问题是,当我尝试提交表单时,应该是必需的字段不会导致任何验证提示出现在表单页面中。就像在中一样,当我提交一个完全空白的表单时,我会被重定向到我指定的页面,而不会出现任何有效性错误提示

不过,表单实际上没有任何数据发送到数据库,因此看起来is_valid函数工作正常,如果我输入一个整数应该是的字符串,我会收到错误消息ok。所以我想知道你是否通常需要做一些额外的编码来显示一些“需要字段”的消息。目前,我让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?在模型形式中,假定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)
如果有效,则记录不会保存,但我没有收到任何错误提示,将必填字段留空


是否有我遗漏的内容?

因为即使表单无效,您仍在重定向。相反,您应该保持在同一个视图上并重新渲染表单。视图应如下所示:

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
快捷方式,所以上下文处理器将这样做。)