Есть ли способ контролировать сообщения после перенаправления или даже очищать сообщения?
Есть ли способ остановить другие проверки после первого редиректа
в файле views.py
from django.contrib import messages
# from django.core.exceptions import ValidationError
from django.shortcuts import render, redirect
def register(request):
if request.method == 'POST':
form = request.POST
phone_number = validate_phone(request, form.get("phone_number"))
username = validate_user_name(request, form.get("username"))
password = validate_password(request, password1=form.get("password1"),password2=form.get("password2"))
....other_fields....
return render(request, 'registration.html',)
def validate_user_name(request, username):
username = username.strip()
new = MyUser.objects.filter(username=username)
if new.count():
messages.error(request, "User with that Username Already Exist")
return redirect("pre_register")
# raise ValidationError("User with that Username Already Exist", code="username_error")
return username
def validate_password(request, password1, password2):
if password1 and password2 and password1 != password2:
messages.error(request, "Passwords don't match")
return redirect("pre_register")
# raise ValidationError("Password don't match")
return password2
....other_validations....
в файле registration.html:
<h3 class="register-heading">Apply as a Member</h3>
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message.tags }} : {{message}}</li>
{% endfor %}
<form method="post">
<input type="text" class="form-control" placeholder="Username *" value=""
required="required" name="username"/>
<input type="text" minlength="10" maxlength="10" name="phone_number"
class="form-control"
placeholder="Your Phone *" value="" required="required"/>
<input type="password" class="form-control" placeholder="Password *" value=""
required="required" , name="password1"/>
<input type="password" class="form-control" placeholder="Confirm Password *"
value="" required="required" , name="password2"/>
</form>
Допустим, пользователь вводит имя пользователя, которое уже существует, что я хочу:
- To keep the already entered post data
- Once it hits this line
messages.error(request, "User with that Username Already Exist")
return redirect("pre_register")
, Я хочу только это в качестве результата (В шаблоне)
error: User with that Email ALready Exists
Вместо этого я получаю все сообщения об ошибках сразу
error: User with that Email ALready Exists
error: Passwords don't match
...all the other errors....
Я знаю, что технически это то, что я должен получить, но как мне достичь того, что я хочу выше. Я думаю, что способом сделать это было бы очистить все сообщения, прежде чем я установлю сообщения об ошибках, но это означает дать серверу больше работы, так как он все равно будет просматривать все сообщения, прежде чем оставить только последнее (И тот факт, что я даже не знаю, как это сделать)
Любая помощь по этому вопросу будет оценена безмерно
Прежде всего, я думаю, что вы путаете, когда использовать render и когда использовать redirect. Обычно используется redirect, когда ваша форма проверяется, чтобы пользователь не мог случайно отправить данные повторно, и render, когда данные недействительны, чтобы ошибки были отображены. Вы делаете все наоборот. Подробнее об этом см. в this antipattern.
Во-вторых, проблема в том, что ваша функция проверки возвращает ответ HTTP. Пользователь никогда не перенаправляется в ваших функциях проверки. Вам нужно вернуть HTTP-ответ из функции представления, чтобы пользователь был перенаправлен. Возможно, вы могли бы использовать закомментированный подход с поднятием ValidationErrors и последующей их поимкой в представлении. Если возникает ошибка, вы добавляете сообщение и отрисовываете шаблон.
Что-то вроде:
def register(request):
if request.method == 'POST':
form = request.POST
try:
phone_number = validate_phone(request, form.get("phone_number"))
username = validate_user_name(request, form.get("username"))
password = validate_password(request, password1=form.get("password1"),password2=form.get("password2"))
....other_fields....
# If all validations pass, you redirect
return redirect('pre_register')
except ValidationError as e:
messages.error(request, str(e))
# passes down to render
# This gets called when it's GET request or the form validation failed.
return render(request, 'registration.html',)