Как правильно передать form.errors после неверной отправки формы - PullRequest
0 голосов
/ 06 февраля 2020

Я создал регистрационное представление, в котором я хочу, чтобы ValidationError (s) отображались после отправки формы, но это недействительно form.is_valid() == False. ChefRegisterationForm является подклассом UserCreationForm. Если форма верна, подойдет сообщение fla sh. С тем, что у меня есть, он выполняет свою работу, но должен быть более чистый способ, чем два 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 %}

1 Ответ

0 голосов
/ 06 февраля 2020

Дайте мне знать, если я что-то упустил, но как насчет этого?

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...