Дополнительное поле в регистрации django (1.9) (сокращение) без использования пользовательской модели пользователя

Я новичок в django, и это может быть вопрос базового уровня для кого-то опытного, но любая помощь будет принята с благодарностью.

Я пытаюсь создать пользовательскую регистрационную форму для пользователя, используя пакет django-registration-redux. На данный момент у меня есть следующая реализация:

модели.ру:

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()

просмотров.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))

формы.ру:

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')),
]

Во-первых, этот метод не выводит поле имени пользователя в регистрационной форме, и я не знаю, как этого добиться. На самом деле, я хотел бы сделать электронную почту USERNAME_FIELD для модели MyUser. Чтобы сделать это, где именно в рабочем процессе я должен это объявить? Самое главное, когда я runserver с приведенным выше кодом, он выдает следующее исключение:

'Manager' object has no attribute 'create_user'

Возможно, мне придется наследоваться от класса AbstractBaseUser, чтобы менеджер мог получить доступ к методу create_user. Я не очень уверен, что это единственный выбор, который у меня есть. Могу ли я в любом случае расширить устаревшую аутентификацию пользователя django, чтобы выполнить вышеуказанное вместо реализации пользовательской аутентификации? Заранее спасибо.


person Bishwarup Bhattacharjee    schedule 04.06.2016    source источник


Ответы (1)


Вы совершенно правы, возможно, вам придется реализовать метод create_user в файле models.py.

Что-то вроде этого:

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)
person fefedo    schedule 12.08.2016