Saya ingin tahu apakah saya bisa membuat UseCreationForm tanpa konfirmasi kata sandi (hanya kata sandi1). Kode yang saya kerjakan:

#forms.py
class UserRegistrationForm(UserCreationForm):
    email = forms.EmailField(max_length=200, help_text='Required')

    class Meta:
        model = User
        fields = ('username', 'email', 'password1', 'password2')

#views.py
class HomeView(View):
    template_name = 'home.html'

    def get(self, request):
        queryset = Profile.objects.filter(verified=True)
        form = UserRegistrationForm()
        context = {
            'object_list': queryset,
            'form':form,
            'num_of_users': User.objects.all().count()
        }
        return render(request, self.template_name, context)

Masalahnya adalah, ketika saya membuat form.py seperti itu:

class UserRegistrationForm(UserCreationForm):
    email = forms.EmailField(max_length=200, help_text='Required')

    class Meta:
        model = User
        fields = ('username', 'email', 'password1')

Form juga memiliki field password2. Ada solusi untuk itu?

6
Barburka 8 Agustus 2017, 16:09

3 jawaban

Jawaban Terbaik

Anda dapat mengganti metode __init__() formulir Anda dan menghapus bidang yang Anda inginkan:

class UserRegistrationForm(UserCreationForm):
    email = forms.EmailField(max_length=200, help_text='Required')

    class Meta:
        model = User
        fields = ('username', 'email', 'password1')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        del self.fields['password2']

Penting: Bagaimanapun, bukanlah praktik umum untuk hanya memiliki satu bidang sandi, karena pengguna dapat salah mengetiknya. Dan tingkat keamanan berkurang banyak.

7
wencakisa 9 Agustus 2017, 06:35

Anda dapat mengganti "password2" dengan nilai Tidak Ada.

class UserRegistrationForm(UserCreationForm):
    password2 = None

    class Meta:
        ...
0
Milad Hatami 18 Desember 2020, 12:35

Alasan formulir Anda memiliki dua bidang kata sandi adalah karena formulir Anda mewarisi dua berkas dari kelas induk, UserCreationForm:

## Based on actual Django source code
class UserCreationForm(forms.ModelForm):
    password1 = forms.CharField(...)
    password2 = forms.CharField(...)

Jika Anda ingin menghapus salah satu bidang, yang harus Anda lakukan adalah menyetelnya ke None di kelas anak Anda.

Namun, Dalam Django 2.1, default UserCreationForm menggunakan password2 untuk memvalidasi kata sandi terhadap validator seluruh situs yang didefinisikan dalam settings.AUTH_PASSWORD_VALIDATORS (sumber : tautan)

Cara mudah untuk mempertahankan validasi sandi, sekaligus menghapus password2, adalah dengan menyetel password2 = None dan mendefinisikan clean_password1:

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import password_validation

class UserRegistrationForm(UserCreationForm):
    email = forms.EmailField(max_length=200, help_text='Required')
    password2 = None

    class Meta:
        model = User
        fields = ('username', 'email', 'password1')

    def clean_password1(self):
        password1 = self.cleaned_data.get('password1')
        try:
            password_validation.validate_password(password1, self.instance)
        except forms.ValidationError as error:

            # Method inherited from BaseForm
            self.add_error('password1', error)
        return password1
4
touch my body 14 September 2018, 19:48