2014-11-26 6 views
0

나는 장고 1.7.1을 사용하고 있으며, 실제로는 발생하지 않아야하는 문제가 발생했습니다.django-admin에 새 필드 추가 사용자

배경 : AbstractUser를 기반으로 사용자 정의 된 사용자 모델을 만들고 있습니다. 현재로서는 - 추가 필드를 하나 추가하고 (테스트 용) 추가 계획을 세우고 있습니다. 어떻게 든 나는 UserChangeForm을 Meta 클래스와 함께 사용하여 DjangoAdmin과 작동하도록 만들었다.

문제점 : Django-docs에 따르면 DjangoAdmin 사이트의 모든 필드를보고, 편집하고, 추가 할 수있는 가능성을 얻으려면 더 많은 작업을 수행 할 필요가 없습니다. 불행히도 -보기 및 편집은 예상대로 작동하지만 DjangoAdmin의 "Add New User"에 관해서는 "Username", "Password"및 "Password confirmation"의 세 필드 만 표시됩니다.

질문 : DjangoAdmin으로 새 사용자를 만드는 동안 더 많은 필드를 채울 수있는 코드를 편집/삽입해야합니까?

엔딩 : 예 - 'fieldsets', 'list_display', 'inline'메소드 등을 포함한 많은 Google 검색 결과를 시도했습니다. 가능한 한 많이 OneToOne을 사용하고 싶습니다. 사용자 모델과의 관계로 인해 많은 포기한 실수가 있었기 때문에 포기하고 다시 돌아가고 싶지 않습니다. 필요하면 코드 스 니펫을 제공하겠습니다.

미리 도움을 주셔서 감사합니다.

+0

워드 프로세서가 포함 커스텀 사용자 모델의 매우 심층 예를 수득 커스텀'UserCreationForm' https://docs.djangoproject.com/ko/1.7/topics/auth/customizing/#a-full-example – Ngenator

+0

나는 django- docs, 그래서 충분히 명확하지 않은 경우 - 나는 또한 이러한 솔루션을 시도했습니다. add_form = UserCreationForm과 같이 문제가있는 것 같습니다. 이것의 효과가없는 것 같아서 왜 찾을 수없는 것입니다. 둘째, AbstractUser 대신 AbstractBaseUser를 사용하면 완전히 새로운 오류 집합이 생성됩니다. – wisienka91

+0

글쎄, 당신의 질문에 대한 답변이 끝났습니다. 구현 방식에 문제가 생기면 코드를 보지 않고는 아무 것도 할 수 없습니다. – Ngenator

답변

1

문제가 NewUserAdmin 클래스 또는 다른 것에서 특정 라인 순서와 관련이 있는지 확실하지 않습니다. 아직 테스트하지는 않았지만 훨씬 이전에이 솔루션에 가까웠다 고 확신합니다. 내가 말하고 있었던 정확한 것 (그것은 일하고있다. 그는 내가 그것을 원했던 방법 :)). 이제는 모든 필드를 사용자 모델에 쉽게 추가 할 수 있으며 세션 관리와 같은 모든 프레임 워크 기능에 계속 연결됩니다. 더 많은 것은 - 나는 AbstractBaseUser 필드 나 OneToOne 필드를 사용하지 않았기 때문에 많은 문제가 발생했다. 어쨌든 - 어떤 도움을 주셔서 감사합니다. 나는 너 없이는 해결하지 않을거야 ... ... 이번 주 : D

PS 나는 모든 수입을 건너 뛰었다. IDE가 필요한 것을 알려줍니다.

models.py

class NewUserManager(UserManager): 
def create_user(self, username, email=None, password=None, **extra_fields): 
    return UserManager.create_user(self, username, email=email, password=password, **extra_fields) 

def create_superuser(self, username, email, password, **extra_fields): 
    return UserManager.create_superuser(self, username, email, password, **extra_fields) 

class NewUser(AbstractUser): 
    newField = models.CharField()  # for example CharField 
    newField = models.CharField(max_length = 12) # important thing - properties should be in the second line 
    objects = NewUserManager() 

    class Meta(AbstractUser.Meta): 
     swappable = 'your_app_name.NewUser' 
     #db_table = 'auth_user'  

admin.py

class NewUserCreationForm(forms.ModelForm): 
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput) 
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput) 

    class Meta: 
     model = NewUser 
     fields = ('username', 'email', 'first_name', 'last_name', 'newField')  # few example fields and new one: newField 

    def clean_password2(self): 
     password1 = self.cleaned_data.get("password1") 
     password2 = self.cleaned_data.get("password2") 
     if password1 and password2 and password1 != password2: 
      raise forms.ValidationError("Passwords don't match") 
     return password2 

    def save(self, commit=True): 
     user = super(NewUserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      user.save() 
     return user 

class NewUserChangeForm(UserChangeForm): 
    class Meta(UserChangeForm.Meta): 
     model = NewUser 
     fields = ('username', 'email', 'first_name', 'last_name', 'newField', 'last_login', 'is_staff')  # few example fields and new one: newField  

forms.py

class NewUserAdmin(UserAdmin): 
    form = NewUserChangeForm 
    add_form = NewUserCreationForm 

    list_display = ('username', 'newField', 'first_name', 'last_name', 'last_login',)  # few example fields and new one: newField 
    fieldsets = (
     (None, {'fields': ('username', 'email', 'first_name', 'last_name', 'newField', 'last_login', 'is_staff')}), # few example fields and new one: newField 
) 

    add_fieldsets = (
     (None, { 
     'classes': ('wide',), 
     'fields': ('username', 'newField', 'password1', 'password2')} # here are fields you want to have in django-admin AddUser view 
    ),   # one of the most important place above 
) 

admin.site.register(NewUser, NewUserAdmin) 
관련 문제