在 html django 中呈现表单

rendering form in 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')

检查旧密码是否与 db 匹配,然后将新密码保存到 db。

那么我应该使用哪种方法,为什么?

要做到这一点你可以这样做。

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 中的 built-in(我真的推荐这种更改密码的方法,因为它做得很好而且不那么令人头疼)。