Рендеринг формы в html django

У меня есть это приложение, и оно работает, но я запутался, использовать ли метод формы или метод POST.get. С формой у меня возникает много проблем, например, рендеринг формы на пользовательском html

Предположим, у меня есть экран изменения пароля, для этого мне нужно создать форму, затем использовать ее в html шаблоне, а с пользовательским html становится сложнее использовать поля формы.

forms.py:

class ChangePasswordForm(PasswordChangeForm):
    old_password = forms.CharField(label="Old Password", strip=False, widget=forms.PasswordInput(
    attrs={'class': 'formField password-genrInput'}))
    new_password1 = forms.CharField(label="New Password", strip=False, widget=forms.PasswordInput(
    attrs={'class': 'formField password-genrInput'}))
    new_password2 = forms.CharField(label="Confirm Password", strip=False, widget=forms.PasswordInput(
    attrs={'class': 'formField password-genrInput'}))

    class Meta:
        model = User
        fields = ('old_password', 'new_password1', 'new_password2')

views.py:

# Password Change View
def changePassword(request):
    if request.method == 'POST':
        form = ChangePasswordForm(request.user, request.POST)
        print(form)
        if form.is_valid():
            print("form valid")
            user = form.save()
            update_session_auth_hash(request, user)
            messages.success(request, "Password Changed Successfully")
            return redirect('changePassword')
        else:
            messages.error(request, "Something Went Wrong, Please Try Again ")
            return redirect('changePassword')

    else:
        form = ChangePasswordForm(request.user)
    return render(request, 'admin/user_auth/change_password.html', {
        'form': form
    })

html:

    {% extends "admin/layouts/default.html" %}
{% load static %}
{% block content%}
           <div class="row">
               <div class="col">
                   <div class="titleBlock">
                    <a href="{{request.META.HTTP_REFERER|escape}}"><h1><i class="fas fa-chevron-circle-left mr-3"></i>Back</h1></a>
                </div>
                    <div class="card">
                        {% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li  {% if message.tags %} class=" {{ message.tags }} " {% endif %}> {{ message }} </li>
    {% endfor %}
</ul>
{% endif %}

                        <form method="post">
                            {% csrf_token %}

                            <div class="formBlock">
                            <div class="row password-genr mt-5">
                                {% for field in form %}
                                
                                <div class="col-md-7">
                                    <div class="formControl static ">
                                        <label for="" class="formLabel">{{field.label}}</label>
                                        {{field}}
                                    </div>
                                </div>    
                               
                               {%endfor%}
                                <div class="col-md-7">
                                    <div class="btnBlock  mt-5">
                                        <button type="submit"  class="btn btn-md">Save</button>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </form>
                    </div>
                </div>
            </div>


            {%endblock content%}

но при простом методе я бы сначала проверил, совпадают ли новый пароль и пароль подтверждения, затем

old_password = request.POST.get('old_password')
new_password = request.POST.get('new_password')

проверьте, что старый пароль совпадает с паролем базы данных, затем сохраните новый пароль в базе данных.

так какой метод я должен использовать и почему?

Чтобы сделать это, вы можете поступить следующим образом.

from django.contrib.auth.hashers import check_password
current_password = request.user.password
old_password = request.POST.get('old_password')
matchcheck= check_password(old_password, current_password) #this returns True or False
if matchcheck:
    #change your password
else:
    #tell the user the password is wrong.

Приведенный выше метод полезен, например, если пользователь хочет удалить свой аккаунт, чтобы сделать это, вы можете использовать идею проверки того, знает ли он свой пароль или нет, если он знает его, то он может удалить свой аккаунт.
И если вы не хотите реализовывать его самостоятельно, вы можете использовать встроенный в Django (я действительно рекомендую этот метод для смены пароля, потому что он хорошо сделан и меньше головной боли).
Вернуться на верх