2017-11-11 133 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) 
相關問題