使用ArticleColumnForm表单,向数据库提交内容,内容包括column。如果同一用户提交的column重复,则提示表单出错,表单提交失败后,重新渲染表单提交html页面,其中提示错误信息。
涉及的代码包括:
1、forms.py
添加__init__方法,初始化表单时,包含提交表单的用户信息。
添加clean_column方法,检查column是否重复
from django import forms
from .models import ArticleColumn
class ArticleColumnForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
user = kwargs.pop('user', None)
super(ArticleColumnForm, self).__init__(*args, **kwargs)
self.user = user
class Meta:
model = ArticleColumn
fields = ('column',)
def clean_column(self):
column = self.cleaned_data.get('column')
user = self.user # 获取传递的用户信息
if ArticleColumn.objects.filter(user=user, column=column).exists():
raise forms.ValidationError('You have already created a column with this name.')
return column
2、views.py
只有在form的valid检查通过后,才进行页面的重定向,否则重新渲染add_column.html页面。渲染是使用的form不是空表,而是刚才提交的,包含错误信息的form。
@login_required
def add_column(request):
if request.method == 'POST':
# 获取表单
article_column_form = ArticleColumnForm(data=request.POST, user=request.user)#初始化表单时,包含用户信息
if article_column_form.is_valid():
new_articlecolumn = article_column_form.save(commit=False) # 创建数据库对象,commit=False,不提交
new_articlecolumn.user = request.user
# 将数据库对象写入
new_articlecolumn.save()
return HttpResponseRedirect('/article/article-column') # 写完数据后,重定向到数据显示页面
else:
article_column_form = ArticleColumnForm()
context = {'article_column_form':article_column_form}
return render(request, 'article/column/add_column.html', context)
3、提交表单的html页面
添加form错误显示区域。
<form class="form-horizontal" action="." method="post">
{% csrf_token %}
<div class="row">
<div class="col-md-4 text-right"><span>栏目名称:</span></div>
<div class="col-md-8 text-left">{{ article_column_form.column }}</div>
</div>
{% if article_column_form.column.errors %}
<div class="errors">
<ul>
{% for error in article_column_form.column.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<div class="button-group">
<button type="submit">Submit</button>
<button type="button" onclick="window.location.href='{% url 'article:article_column' %}'">Cancel</button>
</div>
</form>