我正在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)
因此对于重复名称,它会抛出一个唯一的约束错误,我想在模板中捕获它。任何人都可以提出任何建议。
答案 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
。