Skip to main content
 首页 » 编程设计

python之Django-禁用确认密码

2025年02月15日28小虾米

我遵循了从现已不存在的文档站点复制的以下示例。这个例子太好了 - 这里使用了两个密码字段。

我不想使用确认密码。我只想使用单个密码字段。有什么办法吗?

更新

forms.py 中的 RegistrationForm 使用内置的 UserCreationForm。它包含两个密码字段。


以电子邮件作为主要登录字段的自定义用户模型

模型.py:

from __future__ import unicode_literals 
from django.db import models 
from django.contrib.auth.models import ( 
        AbstractBaseUser, BaseUserManager, PermissionsMixin) 
from django.utils import timezone 
from django.utils.translation import ugettext_lazy as _ 
 
 
class UserManager(BaseUserManager): 
    def _create_user(self, email,password, is_staff, is_superuser, **extra_fields): 
        now = timezone.now() 
        if not email: 
            raise ValueError('users must have an email address') 
        email = self.normalize_email(email) 
        user = self.model(email = email, 
                            is_staff = is_staff, 
                            is_superuser = is_superuser, 
                            last_login = now, 
                            date_joined = now, 
                            **extra_fields) 
        user.set_password(password) 
        user.save(using = self._db) 
        return user 
 
    def create_user(self, email, password=None, **extra_fields): 
        user = self._create_user(email, password, False, False, **extra_fields) 
        return user 
 
    def create_superuser(self, email, password, **extra_fields): 
        user = self._create_user(email, password, True, True, **extra_fields) 
        return user 
 
class User(AbstractBaseUser,PermissionsMixin): 
    """My own custom user class""" 
 
    email = models.EmailField(max_length=255, unique=True, db_index=True, verbose_name=_('email address')) 
    date_joined = models.DateTimeField(auto_now_add=True) 
    is_active = models.BooleanField(default=True) 
    is_staff = models.BooleanField(default=False) 
 
    objects = UserManager() 
 
    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = [] 
 
    class Meta: 
        verbose_name = _('user') 
        verbose_name_plural = _('users') 
 
    def get_full_name(self): 
    """Return the email.""" 
        return self.email 
 
    def get_short_name(self): 
    """Return the email.""" 
        return self.email 

表格.py:

from django import forms 
from django.contrib.auth.forms import UserCreationForm 
from .models import User 
 
 
class RegistrationForm(UserCreationForm): 
    email = forms.EmailField(widget=forms.TextInput( 
        attrs={'class': 'form-control','type':'text','name': 'email'}), 
        label="Email") 
    password1 = forms.CharField(widget=forms.PasswordInput( 
        attrs={'class':'form-control','type':'password', 'name':'password1'}), 
        label="Password") 
    password2 = forms.CharField(widget=forms.PasswordInput( 
        attrs={'class':'form-control','type':'password', 'name': 'password2'}), 
        label="Password (again)") 
 
    '''added attributes so as to customise for styling, like bootstrap''' 
    class Meta: 
        model = User 
        fields = ['email','password1','password2'] 
        field_order = ['email','password1','password2'] 
 
    def clean(self): 
    """ 
    Verifies that the values entered into the password fields match 
    NOTE : errors here will appear in 'non_field_errors()' 
    """ 
        cleaned_data = super(RegistrationForm, self).clean() 
        if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data: 
            if self.cleaned_data['password1'] != self.cleaned_data['password2']: 
                raise forms.ValidationError("Passwords don't match. Please try again!") 
        return self.cleaned_data 
 
    def save(self, commit=True): 
        user = super(RegistrationForm,self).save(commit=False) 
        user.set_password(self.cleaned_data['password1']) 
        if commit: 
            user.save() 
        return user 
 
#The save(commit=False) tells Django to save the new record, but dont commit it to the database yet 
 
class AuthenticationForm(forms.Form): # Note: forms.Form NOT forms.ModelForm 
    email = forms.EmailField(widget=forms.TextInput( 
        attrs={'class': 'form-control','type':'text','name': 'email','placeholder':'Email'}),  
        label='Email') 
    password = forms.CharField(widget=forms.PasswordInput( 
        attrs={'class':'form-control','type':'password', 'name': 'password','placeholder':'Password'}), 
        label='Password') 
 
    class Meta: 
        fields = ['email', 'password'] 

View .py :

from django.shortcuts import redirect, render, HttpResponse 
from django.contrib.auth import login as django_login, logout as django_logout, authenticate as django_authenticate 
#importing as such so that it doesn't create a confusion with our methods and django's default methods 
 
from django.contrib.auth.decorators import login_required 
from .forms import AuthenticationForm, RegistrationForm 
 
 
def login(request): 
    if request.method == 'POST': 
        form = AuthenticationForm(data = request.POST) 
        if form.is_valid(): 
            email = request.POST['email'] 
            password = request.POST['password'] 
            user = django_authenticate(email=email, password=password) 
            if user is not None: 
                if user.is_active: 
                    django_login(request,user) 
                    return redirect('/dashboard') #user is redirected to dashboard 
    else: 
        form = AuthenticationForm() 
 
    return render(request,'login.html',{'form':form,}) 
 
def register(request): 
    if request.method == 'POST': 
        form = RegistrationForm(data = request.POST) 
        if form.is_valid(): 
            user = form.save() 
            u = django_authenticate(user.email = user, user.password = password) 
            django_login(request,u) 
            return redirect('/dashboard') 
    else: 
        form = RegistrationForm() 
 
    return render(request,'register.html',{'form':form,}) 
 
def logout(request): 
    django_logout(request) 
    return redirect('/') 
 
@login_required(login_url ="/") 
def dashboard(request): 
    return render(request, 'dashboard.html',{}) 

设置.py:

AUTH_USER_MODEL = 'myapp.User' 

管理员.py

from django.contrib import admin 
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin 
from django.contrib.auth.models import Group 
from .models import User 
 
 
class UserAdmin(BaseUserAdmin): 
    list_display = ('email','is_staff') 
    list_filter = ('is_staff',) 
    fieldsets = ((None,  
                  {'fields':('email','password')}), ('Permissions',{'fields':('is_staff',)}),) 
    add_fieldsets = ((None, {'classes': ('wide',), 'fields': ('email', 'password1', 'password2')}),) 
    search_fields =('email',) 
    ordering = ('email',) 
    filter_horizontal = () 
 
admin.site.register(User, UserAdmin) 
admin.site.unregister(Group) 

摘自Extending or Substituting User Model - Custom user model with email as primary login field.原作者为Rishabh Agrahari .属性详细信息可以在 contributor page 上找到.来源已根据 CC BY-SA 3.0 获得许 cocoa 以在 Documentation archive 中找到.引用主题ID:1209,示例ID:4050。

请您参考如下方法:

我遇到了同样的问题(虽然基类不同)并通过将 password2 字段设置为 None 来修复它,这有效地删除了基类字段。

class RegistrationForm(UserCreationForm): 
    email = forms.EmailField(blah) 
    password1 = forms.CharField(blah) 
    password2 = None