2017-11-11 135 views
0

我已经覆盖“save_model”方法来管理我的管理员面板应用程序中的用户密码。我要的是:编辑管理面板中的用户密码

  • 创建一个新的随机密码,当我创建新用户(如果密码字段为空)
  • 加密密码(如果我将它设置)
  • 使用用户的密码(如果我改变用户但未设置密码)

如何定义最后的条件?

def save_model(self, request, obj, form, change): 
    if not change and (not form.cleaned_data['password']) : 
     password = User.objects.make_random_password() 
     obj.set_password(password) 
    elif form.cleaned_data['password'] : 
     obj.set_password(form.cleaned_data['password']) 
    else 
     ? 
    super(UserAdmin, self).save_model(request, obj, form, change) 

回答

0

你正在做这一切有点太晚了。用户创建表单甚至不允许您发布没有填写字段password1password2的表单。如果这些字段为空,您将永远不会使用UserAdmin.save_model()方法。

但是,您可以覆盖用户创建表格的save()方法,其中允许密码字段为空,并且如果字段为空(或使用用户密码(如果已输入)),则设置随机密码。

作为奖励,如果用户输入密码(密码不匹配)以及检查AUTH_PASSWORD_VALIDATORS(除了'django.contrib.auth.password_validation.MinimumLengthValidator',因为空密码字段意味着0个字符),此代码将保持表单验证状态。

### admin.py 

from django import forms 
from django.contrib import admin 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.forms import UserCreationForm 
from django.contrib.auth.models import User 


class CustomUserCreationForm(UserCreationForm): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.fields['password1'].required = False 
     self.fields['password2'].required = False 

    def _clean_form(self): 
     super()._clean_form() 

     password1 = self.cleaned_data.get("password1") 
     password2 = self.cleaned_data.get("password2") 

     if password1 != password2: 
      self.add_error('password2', self.error_messages['password_mismatch']) 

    def save(self, commit=True): 
     user = super().save(commit=False) 

     user_password = self.cleaned_data["password1"] 

     if not user_password: 
      user_password = User.objects.make_random_password() 

     user.set_password(user_password) 

     if commit: 
      user.save() 
     return user 


class CustomUserAdmin(UserAdmin): 
    add_form = CustomUserCreationForm 


# Re-register UserAdmin 
admin.site.unregister(User) 
admin.site.register(User, CustomUserAdmin) 
相关问题