password_mismatch on page refresh

Greetings!

I made a working registration system and now I want to track errors in the forms. But when im refresh a registration page i see a password_mismatch error every time.

register.html

{{trace_errors}}
<form method="POST" class="enter-profile__form">
    {% csrf_token %}
    <div class="enter-profile__name">
        <input required name="first_name" id="first_name" class="enter-profile__input" type="text" placeholder="*First name">
        <input required name="last_name" id="last_name" class="enter-profile__input" type="text" placeholder="*Last name">
    </div>
    <input required name="username" id="username" autocomplete="name" class="enter-profile__input" type="text" placeholder="*Login">
    <input required name="email" id="email" autocomplete="email" class="enter-profile__input" type="email" placeholder="*E-mail">
    <input required name="password1" id="password1" class="enter-profile__input" type="password" placeholder="*Pass">
    <input required name="password2" id="password2" class="enter-profile__input" type="password" placeholder="*Confirm pass">
    <button type="submit" class="enter-profile__btn">Register</button>

views.py

def registration(request):
    page_title = "Registration"
    trace_errors = []
    
    if request.method == "POST":
        form = RegisterForm(request.POST)
        if form.is_valid():
            user = form.save()
            user.save()

            return redirect("../login")
        else:
            print(form.errors.as_json()) # form.is_valid() is ALWAYS false when i try to refresh the page, meanwhile if i use a correct data it will be True.
            trace_errors = form.errors.as_json()
            
    else:
        form = RegisterForm()

    return render(request, 'pages/auth/registration.html', {"form":form, "page_title": page_title, "trace_errors": trace_errors})
class RegisterForm(UserCreationForm):
    username = forms.CharField(max_length=12, widget=forms.TextInput(attrs={'class': 'enter-profile__input'}), required=True)
    first_name = forms.CharField(required=True, widget=forms.TextInput(attrs={'class': 'enter-profile__input'}))
    last_name = forms.CharField(required=True, widget=forms.TextInput(attrs={'class': 'enter-profile__input'}))
    email = forms.EmailField(widget=forms.TextInput(attrs={'class': 'enter-profile__input'}))
    password1 = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'enter-profile__input'}))
    password2 = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'enter-profile__input'}))

    class Meta:
        model = User
        fields = ["username", "first_name", "last_name", "email", "password1", "password2"]

Thanks to KenWhitesell
Result register.html

{% if form.errors %}
    {{ form.email.errors }}
    {{ form.username.errors }}
    {{ form.password1.errors }}
    {{ form.password2.errors }}
{% endif %}
<form method="POST" class="enter-profile__form">
    {% csrf_token %}
    <div class="enter-profile__name">
        {{ form.first_name }}
        {{ form.last_name }}
    </div>
    {{ form.username }}
    {{ form.email }}
    {{ form.password1 }}
    {{ form.password2 }}
    <button type="submit" class="enter-profile__btn">Register</button>
</form>

You should not be manually rendering fields in your template. Render the form fields. (See Working with forms.)

1 Like