Есть ли способ контролировать сообщения после перенаправления или даже очищать сообщения?

Есть ли способ остановить другие проверки после первого редиректа

в файле 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>

Допустим, пользователь вводит имя пользователя, которое уже существует, что я хочу:

  1. To keep the already entered post data
  2. 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',)
Вернуться на верх