2016-04-07 27 views
5

Sto usando questo codice (in forms.py) per il mio modulo di iscrizione personalizzato per allauth:django-allauth - modulo di iscrizione Overriding predefinito

class RegistrationForm(UserCreationForm): 
    birth_date = forms.DateField(widget=extras.SelectDateWidget(years=BIRTH_DATE_YEARS)) 

    class Meta: 
     model = get_user_model() 
     fields = ('username', 'email', 'password1', 'password2', 'first_name', 'last_name', 'gender', 'birth_date', 'city', 'country') 

ho ovviamente specificati ACCOUNT_SIGNUP_FORM_CLASS in settings.py al punto a questo modulo e visualizza i campi che ho inserito. Tuttavia, non funziona sull'invio, anche se inserisco il metodo signup che non viene mai richiamato. Ho provato con lo save ma è sempre lo stesso - genera un errore che uno dei miei campi aggiunti personalizzati è vuoto durante la creazione dell'utente e il salvataggio nel database. Quindi, qual è il codice corretto per raggiungere questo?

+0

forse manca l'opzione allauth nelle impostazioni del progetto! per favore guarda la mia risposta e prova ad adattare – rakwen

+0

Io no, come ho detto sopra ho impostato 'ACCOUNT_SIGNUP_FORM_CLASS' e il modulo viene visualizzato correttamente con tutti i campi. Il problema è la sottomissione di esso. – MikiSoft

risposta

12

L'ho fatto grazie a @rakwen chi ha trovato la soluzione corretta here. Ho scritto il mio adattatore personalizzato e metterlo in adapters.py nella mia app:

from allauth.account.adapter import DefaultAccountAdapter 

class AccountAdapter(DefaultAccountAdapter): 
    def save_user(self, request, user, form, commit=False): 
     data = form.cleaned_data 
     user.username = data['username'] 
     user.email = data['email'] 
     user.first_name = data['first_name'] 
     user.last_name = data['last_name'] 
     user.gender = data['gender'] 
     user.birth_date = data['birth_date'] 
     user.city = data['city'] 
     user.country = data['country'] 
     if 'password1' in data: 
      user.set_password(data['password1']) 
     else: 
      user.set_unusable_password() 
     self.populate_username(request, user) 
     if commit: 
      user.save() 
     return user 

Poi ho specificato ACCOUNT_ADAPTER in settings.py per puntare a tale scheda, e finalmente iniziato a lavorare!

3

Nel progetto setting.py tenta di aggiungere questa linea:

verificare se si è aggiunto questo:

AUTHENTICATION_BACKENDS = (
    "django.contrib.auth.backends.ModelBackend", 
    "allauth.account.auth_backends.AuthenticationBackend", 
) 

ACCOUNT_SIGNUP_FORM_CLASS = "yourapp.forms.customSignupForm" 

In app.models

class CustomModel(models.Model): 
    """CustomModel docstring.""" 

    city = forms.CharField(max_length=75) 
    country = forms.CharField(max_length=25) 
    other.... 

In app.forms:

class SignForm(forms.ModelForm): 
    """SignForm docstring.""" 

    username = forms.CharField(
     max_length=30, 
    ) 
    first_name = forms.CharField(
     max_length=30, 
    ) 
    last_name = forms.CharField(
     max_length=30, 
    ) 
    field... 

    def myclean(): 

    def signup(self, request, user): 
     """You signup function.""" 


    # dont forget to save your model 

    class Meta: 
     model = mymodel.CustomModel 
     fields = [ 
      'city', 
      'country', 
      'field...', 
     ] 

Prova questo metodo di lavoro!

+0

domanda: hai un modello personalizzato chiamato Utente? – rakwen

+0

Sì, ho un modello utente personalizzato con i miei campi aggiuntivi personalizzati. – MikiSoft

+0

se non si crea un profilo o altro come questo, questo modello deve avere una relazione oneToOne con l'utente django e aggiungere gli altri campi correnti. creare un modelForm non una forma semplice. Guarda adattare la mia risposta al tuo contesto. – rakwen