2017-11-11 1 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 (모두 빈 암호 필드가 0 문자이므로 'django.contrib.auth.password_validation.MinimumLengthValidator'을 제외한 모든 문자)을 검사합니다.

    ### 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) 
    
    관련 문제