2011-04-21 4 views
13

Django에서 사용자 인증 모듈을 활성화했지만, UserCreationForm을 사용하면 사용자 이름과 암호/암호 확인 필드 만 묻습니다. 전자 메일 및 전체 이름 필드도 필요하며 필수 필드로 설정합니다. Django는 사용자 정의 UserCreationForm을 만듭니다.

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

class RegisterForm(UserCreationForm): 
    email = forms.EmailField(label = "Email") 
    fullname = forms.CharField(label = "Full name") 

    class Meta: 
     model = User 
     fields = ("username", "fullname", "email",) 

지금 양식이 새 필드를 표시하지만, 데이터베이스에 저장하지 않습니다

나는이 일을했습니다.

어떻게 수정할 수 있습니까?

def save(self, commit=True): 
     user = super(RegisterForm, self).save(commit=False) 
     user.fullname = self.cleaned_data["fullname"] 
     user.email = self.cleaned_data["email"] 
     if commit: 
      user.save() 
     return user 

http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/forms.py#L10

답변

18

은 사용자 모델에서 fullname라는 그런 분야가 없습니다 :

+0

좋은 기본 장고 사용자 작성 양식에 LAST_NAME을 추가 admin.py에 쓴 것입니다 대답했다.데이터베이스의 'full_name'필드는 신경 쓰지 않지만 등록 양식을 편집하여 이름과 성을 제외하고 'full name'필드를 요구할 수 있습니까? –

+0

나는 따라하기로 확신하지 않는다 ... 당신은 fullname을위한 폼에 하나의 필드 만 갖고 싶지만 그것이 저장되는지 아닌지 상관하지 않는다고 말하는가? 또는 하나의 fullname 필드를 갖고 User 모델을 사용하여 필드를 저장할 수있는 방법을 묻는 중입니까? – chandsie

+0

양식에서 "전체 이름"이라는 하나의 필드를 원하지만 User 모델의 fullname 필드에 저장하려고합니다. 할 수없는 경우 모델의 first_name 및 last_name 필드에 저장하기 위해 fullname 필드를 분할하십시오. –

4

당신은 UserCreationForm.save() 메서드를 재정의해야합니다.

원래 모델을 사용하여 이름을 저장하려면 이름과 성으로 별도로 저장해야합니다.

편집 : 폼에서 하나 개의 필드를 원하는 여전히 원래 사용자 모델은 다음과 같은 사용 사용하는 경우 :

당신은 같은 것을 할 수 있습니다 : 이제

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

class RegisterForm(UserCreationForm): 
    email = forms.EmailField(label = "Email") 
    fullname = forms.CharField(label = "First name") 

    class Meta: 
     model = User 
     fields = ("username", "fullname", "email",) 

당신이이 manji가 말한 것과 save 메소드를 오버라이드하지만 사용자 모델은 fullname 필드를 갖지 않으므로 다음과 같이 보일 것입니다 :

def save(self, commit=True): 
     user = super(RegisterForm, self).save(commit=False) 
     first_name, last_name = self.cleaned_data["fullname"].split() 
     user.first_name = first_name 
     user.last_name = last_name 
     user.email = self.cleaned_data["email"] 
     if commit: 
      user.save() 
     return user 

참고 : 입력 한 전체 이름에 성과 이름의 두 부분 만 포함하고 다른 문자는 유효하도록 전체 이름 필드에 대한 정리 메서드를 추가해야합니다. 사용자 모델에 대한

참조 소스 코드는 :

http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/models.py#L201 
4

난 그냥 StackOverflow의에서 계정에 가입하고, 따라서 chands '대답에 답장하는 데 필요한 포인트가 부족합니다.

first_name, last_name = self.cleaned_data["fullname"].split() 

이 제기하지만, 다음 코드 줄에주의 : 전체 이름은 "푸 바 바즈"(같은 경우 'ValueError를 풀고 너무 많은 값을'예를 들어, 공백의 두 인스턴스 사용자가있는 경우 중간 이름). 약간의 변형을 사용하여 처음 공백 뒤에 오는 모든 것을 last_name에 채 웁니다.

first_name, last_name = self.cleaned_data["fullname"].split(None, 1) 
2

장고 1.10이것은 내가 FIRST_NAME, 이메일

from django.contrib.auth.admin import UserAdmin as BaseUserAdmin 
from django.contrib import admin 
from django.contrib.auth.models import Group, User 

# first unregister the existing useradmin... 
admin.site.unregister(User) 

class UserAdmin(BaseUserAdmin): 
    # The forms to add and change user instances 
    # The fields to be used in displaying the User model. 
    # These override the definitions on the base UserAdmin 
    # that reference specific fields on auth.User. 
    list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff') 
    fieldsets = (
    (None, {'fields': ('username', 'password')}), 
    ('Personal info', {'fields': ('first_name', 'last_name', 'email',)}), 
    ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}), 
    ('Important dates', {'fields': ('last_login', 'date_joined')}),) 
    # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin 
    # overrides get_fieldsets to use this attribute when creating a user. 
    add_fieldsets = (
    (None, { 
     'classes': ('wide',), 
     'fields': ('username', 'email', 'first_name', 'last_name', 'password1', 'password2')}),) 
    list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups') 
    search_fields = ('username', 'first_name', 'last_name', 'email') 
    ordering = ('username',) 
    filter_horizontal = ('groups', 'user_permissions',) 

# Now register the new UserAdmin... 
admin.site.register(User, UserAdmin) 
관련 문제