0

저는 장고를 처음 접했고 경험이 많은 사람을위한 기본 질문 일 수도 있지만 도움이 될 것입니다.사용자 정의 사용자 모델을 구현하지 않고 django (1.9) 등록 (redux)의 추가 필드

django-registration-redux 패키지를 사용하여 사용자에 대한 사용자 정의 등록 양식을 만들려고합니다. 지금 현재로 다음과 같은 구현이 있습니다

models.py :

from django.db import models 
from django.contrib.auth.models import User 

class MyUser(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    date_of_birth = models.DateField() 

views.py :

class UserProfileRegistration(RegistrationView): 
    success_url = '/' 
    form_class = UserProfileRegistrationForm 

    def register(self, form): 
     """ 
     Implement user-registration logic here. 

     """ 

     User = MyUser 
     user = User.objects.create_user(
      username = form.cleaned_data['username'], 
      first_name = form.cleaned_data['first_name'], 
      last_name = form.cleaned_data['last_name'], 
      email=form.cleaned_data['email'], 
      password=form.cleaned_data['password1'] 
     ) 
     if not self.registration_allowed(): 
      return redirect(self.disallowed_url) 
     return redirect(self.get_success_url(user)) 

forms.py :

from registration.forms import RegistrationForm 
from django import forms 
from django.forms.extras import SelectDateWidget 
import datetime 
from .models import MyUser 

class UserProfileRegistrationForm(RegistrationForm): 
    first_name = forms.CharField(max_length=15, label='First name') 
    last_name = forms.CharField(max_length=15, label='Last name') 
    date_of_birth = forms.DateField(label='Date of birth', 
            widget=SelectDateWidget(years=[y for y in range(1950, 
                        datetime.datetime.now().year-17)], 
                  attrs=({'style': 'width: 20%; display: inline-block;'})),) 

    class Meta: 
     model = MyUser 
     fields = ("email", 'first_name', 'last_name', 
        'date_of_birth') 

urls.py

from .views import UserProfileRegistration 
urlpatterns = [ 

    url(r'^accounts/register/$', UserProfileRegistration.as_view(), name='registration_register'), 
    url(r'^accounts/', include('registration.backends.simple.urls')), 
] 

첫째,이 방법은 등록 양식에 사용자 이름 필드를 출력하지 않으며이를 달성하는 방법을 모르겠습니다. 사실, MyUser 모델에 대한 USERNAME_FIELD 전자 메일을 만들고 싶습니다. 워크 플로우에서 정확히 어디에서 선언해야합니까? 가장 중요한 것은 , 나는 위의 코드와 runserver, 그것은 나에게 다음과 같은 예외가 발생합니다 :

'Manager' object has no attribute 'create_user' 

은 아마도, 내가 관리자가 CREATE_USER 방법에 액세스 할 수 있도록 AbstractBaseUser 클래스에서 상속해야합니다. 그것이 내가 가진 유일한 선택인지는 확실하지 않습니다. 어쨌든 나는 장고 구식 사용자 인증을 확장하여 사용자 정의 인증을 구현하는 대신 위의 작업을 수행 할 수 있습니까? 미리 감사드립니다.

답변

0

당신은 models.py에 create_user 메소드를 구현해야 할 수도 있습니다. 이 같은

뭔가 :

class UserManager(BaseUserManager): 
def create_user(self, email, phone_number, password=None): 
    """ 
    Creates and saves a User with the given email 
    phone_number and password. 
    """ 
    if not email: 
     raise ValueError('Informe um email por favor.') 

    user = self.model(
      email=self.normalize_email(email), 
      phone_number=phone_number 
    ) 

    user.set_password(password) 
    user.save(using=self._db) 
    return user 

def create_superuser(self, email, phone_number, password): 
    """ 
    Creates and saves a superuser with the given email 
    phone_number and password. 
    """ 
    user = self.create_user(email, 
          password=password, 
          phone_number=phone_number 
          ) 
    user.is_admin = True 
    user.save(using=self._db) 
    return user 

가 당신을 도와 바랍니다.

다른 생각은 django 신호를 view.py에 호출하는 것입니다.

signals.user_registered.send(sender=self.__class__, 
           user=user, 
           request=self.request)