python - Django - ValidationError 不显示

标签 python django

我最近尝试了表单验证并遇到了 ValidationError() 问题。

当我提交表单时,表单错误不会出现在我的网站上。

代码如下:

forms.py

class ArticleForm(forms.ModelForm):

    def clean_titre(self):
        titre = self.cleaned_data['titre']
        if len(titre) < 5:
            raise ValidationError('myError')
        return titre

form = ArticleForm()

template.html

<div class="form-group">TITRE
  {{ form.titre.errors }}
  {{ form.titre }}
</div>

views.py

def AddArticle(request):
    form = ArticleForm(request.POST, request.FILES)

    if form.is_valid():
        save_it = form.save(commit=False)
        save_it.user = request.user
        save_it.save()
        form.save_m2m()
        return HttpResponseRedirect('/')

我做错了什么?

--- 编辑 ---

完整template.html

<form class="form" action="{% url "article.views.AddArticle" %}" method="post" enctype='multipart/form-data'>
    {% csrf_token %}

    <div class="form-group">TITRE
      {{ form.titre.errors }}
      {{ form.titre }}
    </div>
    <div class="form-group">SUMMARY
      {{ form.media }}
      {{ form.summary.errors }}
      {{ form.summary }}
    </div>
    <div class="form-group">CONTENU
      {{ form.media }}
      {{ form.contenu.errors }}
      {{ form.contenu }}
    </div>
    <div class="form-group">
      {{ form.image.errors }}
      {{ form.image }}
   </div>
   <div class="form-group">TAGS
      {{ form.tags.errors }}
      {{ form.tags }}
   </div>
   <input type="submit" class="btn btn-default" value="Submit" autocomplete="off" autocorrect="off" />
</form>

我也会发布完整的 forms.py,它可能会有所帮助。

forms.py

class ArticleForm(forms.ModelForm):

    def clean_titre(self):
        titre = self.cleaned_data['titre']
        if len(titre) < 5:
            raise ValidationError('myError')
        return titre

    class Meta:
        model = Article
        exclude = ['date', 'rating', 'user']

        widgets={
            "titre":forms.TextInput(attrs={'placeholder':'Le titre', 'class':'form-control'}),
            "contenu":forms.Textarea(attrs={'placeholder':'Le Contenu de votre message', 'class':'form-control'}),
            "image":forms.FileInput(attrs={'placeholder':'Votre Image', 'id':'uploadBtn'}),
            "tags":TagWidget(attrs={'placeholder':'Vos Tags', 'class':'form-control'}),
        }

form = ArticleForm()

最佳答案

您的 View 中缺少 else 部分。以下是表单通常执行的一般流程:

  1. 用户通过 GET 导航到页面,该页面向他们显示表单
  2. 用户填写表单并使用 POST 提交
  3. 如果表单有效,用户将被定向到不同的页面
  4. 如果表单无效,用户将看到与步骤 1 相同的页面,并显示验证错误。用户更正后,将进入第 2 步。

这是 django View 中的流程:

def AddArticle(request):
    if request.method == 'POST':
        form = ArticleForm(request.POST, request.FILES)
        if form.is_valid():
            save_it = form.save(commit=False)
            save_it.user = request.user
            save_it.save()
            form.save_m2m()
            return HttpResponseRedirect('/')

    else:
       form = ArticleForm()

    return render(request, 'template.html', {'form': form'})

不过,我会考虑在 Django 中使用基于类的 View 。最初,它们可能看起来非常令人困惑,但随着时间的推移,您将学会欣赏它们。 Docs 。另一个有用的resource学习CBV时。

通过使用 CBV,以上可以简化为:

class AddArticleView(CreateView):
    success_url = 'name_of_view_here'
    form_class = ArticleForm
    template_name = 'template.html'

# urls.py
urlpatterns = patterns('', url(r'^articles/add/$', AddArticleView.as_view()))

模板

除了每个字段错误之外,您还需要在模板中包含整体表单错误:

<form class="form" action="{% url "article.views.AddArticle" %}" method="post" enctype='multipart/form-data'>
    {% csrf_token %}
    {{ form.non_field_errors }}
    ...
</form>

请注意,您可能需要使用一些引导标记来封装错误。更多信息docs

关于python - Django - ValidationError 不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31630436/

相关文章:

django - 如何使用 django 服务 HTTP/2 协议(protocol)

python - 在 Django 中搜索并获取匹配的 LDAP 用户列表

Python系统日志文件

python - 如何在python中更改字符串中的字母

python - 为什么 localhost :5000 not work in Flask?

javascript - 如何在 Django 博客中添加社交分享按钮

html - 在html表格中显示自增序列号

python - 为 Python 安装简单音频时出现 “ERROR: Command errored out with exit status 1: python.”

python - 如何通过 Python 中的 Sagemath 库理解可疑的语法应用

django - 如何在 django-import-export 中只有 CSV、XLS、XLSX 选项?