Django - ValidationError不显示

时间:2015-07-25 19:41:58

标签: 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()

1 个答案:

答案 0 :(得分:3)

您缺少视图中的else部分。以下是通常采用的形式的一般流程:

  1. 用户通过GET导航到一个页面,其中显示了一个表单
  2. 用户填写表单并使用POST
  3. 提交
  4. 如果表单有效,则会将用户定向到其他页面
  5. 如果表单无效,将向用户显示与步骤1中相同的页面,并显示验证错误。用户更正后,他们将进入第2步。
  6. 以下是django视图中的流程:

    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中使用基于类的视图。最初它们看起来很混乱,但随着时间的推移,你会学会欣赏它们。 Docs。学习CBV时另一个有用的resource

    通过使用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

    中的更多信息