Django提交表单出错&提示错误

发布于:2024-05-18 ⋅ 阅读:(146) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到