Nama saya Paul, saya seorang pemula sekolah menengah awal yang mengerjakan proyek "independen" pertama saya. “Mandiri” artinya tanpa bimbingan tutorial. Tujuan saya membuat situs kalender, hanya untuk melacak daftar acara seperti pekerjaan rumah, rapat, dan semacamnya.

Saat ini saya sedang mengerjakan formulir pendaftaran. Pada awalnya, saya menggunakan UserCreationForm bawaan tetapi saya memutuskan untuk membuat formulir HTML saya sendiri. Saya sedang mengerjakan membuat ulang 2 formulir konfirmasi kata sandi ini yang akan mengambil dua input, pastikan tidak ada kunci terlarang, pastikan kedua kata sandi cocok, dan kemudian simpan kata sandi itu ke kata sandi model Pengguna, bersama dengan nama pengguna, first_name, dan last_name (ini akan terjadi di file view.py saya).

Ketika saya pertama kali mencoba mendaftar, tidak ada yang muncul dan ketika saya memeriksa halaman admin ternyata tidak ada Pengguna baru yang dibuat. Jadi saya memasang pesan di seluruh tampilan saya jika pernyataan untuk melihat di mana kode terpotong. Ternyata form.is_valid mengembalikan false, dan saya tidak terlalu yakin mengapa.

Saya ingin percaya bahwa input formulir HTML saya tidak cocok dengan bidang form.py saya, tetapi saya memerlukan bantuan untuk memperbaikinya. Bantuan apa pun akan sangat dihargai.

Ini adalah file form.py saya.

from django import forms
from django.contrib.auth.models import User


class UserRegisterForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['username', 'first_name', 'last_name', 'password']

Ini adalah file register.html, formulir di mana input dari dua kata sandi berada. Formulir ini diperluas ke templat dasar lain.

<form method="POST">
    {% csrf_token %}
    <div>
        <label for="id_username">Username: </label>
        <div>
            <input id="id_username" type="text" name="username">
        </div>
    </div>
    <div>
        <label for="id_first_name">First Name: </label>
        <div>
            <input id="id_first_name" type="text" name="first_name">
        </div>
    </div>
    <div>
        <label for="id_last_name">Last Name: </label>
        <div>
            <input id="id_last_name" type="text" name="last_name">
        </div>
    </div>
    <div>
        <label for="id_password1">Password: </label>
        <div>
            <input id="id_password1" type="password" name="password1">
        </div>
    </div>
    <div>
        <label for="id_password2">Password Confirmation: </label>
        <div>
            <input id="id_password2" type="password" name="password2">
        </div>
    </div>
    <button type="submit">Register</button>
    <div>
        <small>Already Have An Account? <a href="{% url 'login' %}">Login</a></small>
    </div>
    {% if messages %}
    {% for message in messages %}
    <div role="alert">
        {{ message }}
    </div>
    {% endfor %}
    {% endif %}
</form>

Dan ini adalah file views.py saya, di mana saya mencoba memverifikasi bahwa kedua kata sandi sesuai dengan kriteria dan kemudian menyimpannya ke model Pengguna.

from django.shortcuts import render, redirect
from .forms import UserRegisterForm
from django.contrib.auth.decorators import login_required
from django.contrib import messages


def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)  
        if form.is_valid():
            password1 = request.POST.get('password1')
            password2 = request.POST.get('password2')
            keys = {'a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f', 'F', 'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J',
                    'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'o', 'O', 'p', 'P', 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T',
                    'u', 'U', 'v', 'V', 'w', 'W', 'x', 'X', 'y', 'Y', 'z', 'Z', '1', '2', '3', '4', '5', '6', '7', '8',
                    '9', '0', '-', '_', '.'}
            for key in keys:
                if key not in password1:
                    if password1 == password2:
                        form.instance.password = password1
                        form.save()

                        messages.success(request, 'User has been saved.')
                        return redirect('login')
                    else:
                        messages.error(request, 'Passwords do not match.')
                        return redirect('register')
                else:
                    messages.error(request, 'Password contains illegal keys.')
                    return redirect('register')
        else:
            messages.error(request, 'Form is not valid.')
    else:
        messages.error(request, 'request method is not POST.')
        form = UserRegisterForm()

    return render(request, 'User/register.html', {'form': form})

Pada pernyataan if terakhir, saya tidak yakin bagaimana cara menyimpan kata sandi ke dalam formulir untuk membuat Pengguna. Terima kasih atas waktu Anda, dan bantuan apa pun akan sangat dihargai.

0
Sno Bear 3 Juni 2020, 05:41

1 menjawab

Jawaban Terbaik

Anda perlu memvalidasi dan mendapatkan kata sandi di form.py.

Form.py

class UserRegisterForm(forms.ModelForm):
"""
New User Form. Requires password confirmation.
"""
password1 = forms.CharField(
    label='Password', widget=forms.PasswordInput
)
password2 = forms.CharField(
    label='Confirm password', widget=forms.PasswordInput
)

class Meta:
    model = User
    fields = ['username', 'first_name', 'last_name', 'password']

# to make sure the password and the confirm password are equal
def clean_password2(self):
    # Check that the two password entries match
    password1 = self.cleaned_data.get("password1")
    password2 = self.cleaned_data.get("password2")
    if password1 and password2 and password1 != password2:
        raise forms.ValidationError("Passwords do not match")
    return password2

# to make sure the added detail of the user in form is saved in database
def save(self, commit=True):
    # Save the provided password in hashed format
    user = super().save(commit=False)
    user.set_password(self.cleaned_data["password1"])
    if commit:
        user.save()

    return user

View.py

def register(request):
form = UserRegisterForm(request.POST)

# if the data provided in the form is valid than save the form 
if form.is_valid():
    user = form.save(commit=False)
    user = form.save()
    raw_password = form.cleaned_data.get('password1')

    user = authenticate(request, email=user.email, password=raw_password)

    if user is not None:
        login(request, user)
    return redirect('login')

return render(request, 'User/register.html', {'form': form})

Semoga ini memberi Anda gambaran tentang cara kerja konfirmasi kata sandi.

0
ngawang13 3 Juni 2020, 04:41