首页 > 解决方案 > 提交无效表单后如何正确传递 form.errors

问题描述

我创建了一个注册视图,我希望ValidationError在提交表单后显示它,但它恰好是无效 form.is_valid() == False的。ChefRegisterationForm是 的子类UserCreationForm。如果表单是有效的,就会有一条闪现消息。有了我所拥有的,它可以完成工作,但必须有一种比render在视图中包含两个语句更简洁的方法。这怎么能被重构以便只有一个render语句?

def register_chef(request):
    if request.method == 'POST':
        new_user_form = ChefRegisterationForm(request.POST)
        if new_user_form.is_valid():
            user = new_user_form.save()
            login(request, user)
            messages.info(
                request,
                f"Logged in: {user}!"
            )
            return HttpResponseRedirect(reverse("menu:menu_list"))
        return render(request, 'chef/register_chef.html', {'form': new_user_form})
    new_user_form = ChefRegisterationForm()
    return render(request, 'chef/register_chef.html', {'form': new_user_form})
{% extends 'index.html '%}

{% block content %}
    {% if form.errors %}
        {% for field in form %}
            {% for error in field.errors %}
                <p>{{ error }}</p>
            {% endfor %}
        {% endfor %}
    {% endif %}
    <form action="{% url 'chef:register' %}" method="post">
        {% csrf_token %}
        {% for field in form %}
            {{ field }}
        {% endfor %}
        <button>Register</button>
    </form>
    {% for key in form.errors %}
        {{ key }}
    {% endfor %}
{% endblock %}

标签: pythondjango

解决方案


如果我遗漏了什么,请告诉我,但是这个怎么样?

def register_chef(request):
    if request.method == 'POST':
        new_user_form = ChefRegisterationForm(request.POST)
        if new_user_form.is_valid():
            user = new_user_form.save()
            login(request, user)
            messages.info(request, f"Logged in: {user}!")
            return HttpResponseRedirect(reverse("menu:menu_list"))
    else:
        new_user_form = ChefRegisterationForm()
    return render(request, 'chef/register_chef.html', {'form': new_user_form})

你可能想看看基于类的 -FormView我认为 - 会减少你必须编写的样板:

class ChefRegisterView(FormView):
    form_class = ChefRegisterationForm
    success_url = reverse("menu:menu_list")
    template_name = 'chef/register_chef.html'

    def form_valid(self, form):
        user = new_user_form.save()
        login(request, user)
        messages.info(request, f"Logged in: {user}!")
        return super().form_valid(form)

推荐阅读