Django - форма не отображается в HTML при получении ошибки - PullRequest
0 голосов
/ 05 ноября 2019

В моем проекте Django я отображаю форму, когда пользователь отправляет запрос GET.

Вот код для этого:

form = SignUpForm()
if request.method == 'POST':
     ....
else:
   return render(request, 'users/signup.html', {'form': form})

HTML ДЛЯ ЭТОГО:

 <form method="POST" class="signupform">
                {% csrf_token %}
                {% for field in form %}
                    <div class="fields">{{ field }}</div>
                    {{ field.errors }}
                    <br>
                {% endfor %}    
                <input class="submitButton" type="submit" value="Sign Up">
 </form>

Если пользователь отправляет запрос на публикацию, я устанавливаю form = SignUpForm(request.POST) и проверяю, существует ли пользователь с тем же именем пользователя, что и у кого-то еще. Когда это происходит, я хочу снова отобразить всю страницу, включая поля формы, с отображением сообщения об ошибке.

Вот мой текущий код для этого:

                    try:
                        user = User.objects.get(username=form.cleaned_data['username'])
                        return render(request, 'users/signup.html', {'error': 'Username field has already been taken', 'form':form})
                    except User.DoesNotExist:
                        ...

HTML:

{% if error %}
            <form method="POST" class="signupform">
                    {% csrf_token %}
                    {% for field in form %}
                        <div class="fields">{{ field }}</div>
                        {{ field.errors }}
                        <br>
                    {% endfor %}    
                    <input class="submitButton" type="submit" value="Sign Up">
                </form>
                {{ error }}
{% endif %}

Однако, когда возникает эта ошибка, сообщение об ошибке отображается, но ни одно из полей формы не отображается на экране. Они исчезаютКто-нибудь знает проблему? Спасибо.

Обновлен код:

context = []
if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            if not form.cleaned_data['password'] == form.cleaned_data['confirmPassword']:
                context["error"] = 'Username field has already been taken' 
        else:
            raise Http404
else:
    form = SignUpForm()
context['form'] = form
return render(request, 'users/signup.html', context)

1 Ответ

1 голос
/ 05 ноября 2019

View.py:

context = {}
if request.method == 'POST':
    form = SignUpForm(request.POST)
    try:
        user = User.objects.get(username=form.cleaned_data['username'])
        messages.error(request, 'Username field has already been taken')
        return redirect('users/signup.html')

    except User.DoesNotExist:
         ...
else:
    form = SignUpForm()

context['form'] = form
return render(request, 'users/signup.html', context)

шаблон:

{% if messages %}
    {% for message in messages %}
        {{ message }}
    {% endfor %}
{% endif %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...