在模板中渲染django模型验证错误

时间:2016-03-19 03:40:11

标签: python django

我正在django上构建一个Web应用程序。作为其中的一部分,我创建了一个html表单,如下所示:

 <form method="post" action="/voting/add_state/">{% csrf_token %}
     State name:<br>
     <input type="text" name="state_name"><br>
     <input type="submit" value="Submit">
 </form>

在models.py中,我在名称上添加了唯一约束验证,如下所示:

class State(models.Model):
   name = models.CharField(max_length=200, unique=True)
   vote_counted = models.BooleanField(default=False)

因此对于重复名称,它会抛出一个唯一的约束错误,我想在模板中捕获它。任何人都可以提出任何建议。

3 个答案:

答案 0 :(得分:0)

Django内置Form处理.Django有“Model Forms”,它会自动为您的模型呈现表单。如果您通过视图传递它并在上下文中引用它,它将自动为您生成html,但如果您想要更多地控制模板中呈现的内容,那么您可以引用Django Model Form生成的表单属性。 / p>

我强烈建议在Django为您提供构建表单的框架内工作;它为构建,验证和抽象表单提供了大量的样板代码,尤其适用于这些简单的表单。

以下是一个例子:

models.py

comments

forms.py

class State(models.Model):
  name = models.CharField(max_length=200, unique=True)
  vote_counted = models.BooleanField(default=False)

views.py

class StateForm(forms.ModelForm):
    model = State
    fields = (name,)

state_form.html(自动生成表单的示例)

from django.views.generic.edit import FormView

class StateForm(FormView):
    template_name = 'state_form.html'
    form_class = StateForm
    success_url = '/thanks/'

state_form.html(自定义表单的示例)

{{ form }}

参考文献:

Django表格: https://docs.djangoproject.com/en/1.9/topics/forms/

Django模型表格:https://docs.djangoproject.com/en/1.9/topics/forms/modelforms/

Django Generic Views: https://docs.djangoproject.com/en/1.9/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView

答案 1 :(得分:0)

根据您的模型创建表单

#forms.py
from django import forms
from .models import State

class StateForm(forms.ModelForm):

    class Meta:
        model = State
        fields = ('name',)

现在在您的观看中使用此表单

#views.py
from django.views.generic import FormView
from .forms import StateForm

class MyView(FormView):

    template_name = 'template.html'
    form_class = StateForm
    success_url = '/my-url-to-redirect-after-submit/'

template.html

<form method="post">
    {% csrf_token %}
    Name 
    {{ form.name }}
    {{ form.name.errors }}
    <input type="submit" value="Create">
</form>

答案 2 :(得分:0)

您可以为State模型创建一个表单并创建验证器,因此如果用户尝试使用重复的名称,表单会引发如下消息:

models.py
class State(models.Model):
   name = models.CharField(max_length=200, unique=True)
   vote_counted = models.BooleanField(default=False)

forms.py
def unique_name(value):
    exist = State.objects.filter(name=value)
    if exist:
        raise ValidationError(u"A state with the name %s already exist" % value)

class StateForm(forms.Form):
    name = forms.CharField(label=('Name:'), validators=[unique_name])

然后你只需要在模板中渲染StateForm