0

私はdjangoにかなり慣れていないため、これは経験豊富な人にとっては基本的なレベルの質問かもしれませんが、どんな助けも大歓迎です.

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

ビュー.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))

フォーム.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'

おそらく、AbstractBaseUser クラスから継承して、マネージャーが create_user メソッドにアクセスできるようにする必要があります。それが私の唯一の選択肢かどうかは定かではありません。カスタム認証を実装する代わりに、djangoのレガシーユーザー認証を拡張して上記を達成できる方法はありますか? 前もって感謝します。

4

1 に答える 1

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

お役に立てば幸いです。

他に考えられることは、view.py で django シグナルを呼び出すことです。

signals.user_registered.send(sender=self.__class__,
                                 user=user,
                                 request=self.request)
于 2016-08-12T01:09:58.323 に答える