0

Ich bin ziemlich neu in django und dies könnte eine Grundstufe Frage für jemanden erlebt, aber jede Hilfe wird sehr geschätzt.Extra-Feld in django (1.9) Registrierung (Redux) ohne Verwendung von Implementieren von benutzerdefinierten Benutzermodell

Ich versuche, eine benutzerdefinierte Anmeldeformular für den Benutzer mit django-registration-redux Paket zu erstellen. Ich habe die folgende Umsetzung ab sofort:

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

Erstens gibt diese Methode kein Benutzernamefeld im Registrierungsformular aus und ich bin nicht sicher, wie das zu erreichen ist. In der Tat möchte ich die E-Mail USERNAME_FIELD für das MyUser-Modell machen. Um das genau im Workflow zu tun, muss ich es deklarieren? Am wichtigsten ist, wenn ich runserver mit dem obigen Code, es mir die folgende Ausnahme ausgelöst:

'Manager' object has no attribute 'create_user' 

Vielleicht muss ich von der AbstractBaseUser Klasse erben der Manager zu ermöglichen, die create_user Methode zuzugreifen. Ich bin mir nicht sicher, ob das die einzige Wahl ist, die ich habe. Kann ich die django-Legacy-Benutzerauthentifizierung erweitern, um das oben genannte zu erreichen, anstatt eine benutzerdefinierte Authentifizierung zu implementieren? Danke im Voraus.

Antwort

0

Sie haben recht, möglicherweise müssen Sie die Methode create_user auf Ihrem models.py implementieren.

Etwas wie folgt aus:

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 

Hoffe, dass es Ihnen geholfen.

Andere, was Sie über vielleicht denken ist django Signal auf Ihrem view.py. anrufen

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