2014-02-02 3 views
1

Я использую пользовательскую форму для регистрации с django-allauth.UserProfile отсутствует объект User

settings.py

ACCOUNT_SIGNUP_FORM_CLASS = 'project.userprofile.form.UserSignupForm' 

form.py

from django import forms 
from models import UserProfile 

class UserSignupForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('mobile_number',) 

models.py

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

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    mobile_number = models.CharField(max_length=30, blank=True, null=True) 

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0]) 

User и UserProfile объекты создаются, однако UserProfile не связан с любым объектом пользователя. Уже поздно, и я, наверное, пропустил что-то глупое, не так ли?

UPDATE: Кевин отметил, решение было добавить метод сохранения в form.py. Вот как это выглядит сейчас:

from django import forms 
from django.contrib.auth.models import User 
from models import UserProfile 

class UserSignupForm(forms.ModelForm): 

    class Meta: 
     model = UserProfile 
     fields = ('mobile_number',) 

    def save(self, user): 
     profile = UserProfile(user=user) 
     profile.mobile_number = self.cleaned_data['mobile_number'] 
     profile.save() 

ответ

1

documentation говорит:

[ACCOUNT_SIGNUP_FORM_CLASS] должен реализовать метод «сохранить», принимая недавно подписался пользователь в качестве единственного параметра.

Похоже, что вы не предоставили такой метод, чтобы пользователь никогда не подключался к профилю. И я думаю, что вы не видите ошибку, потому что ModelForm имеет метод save(commit=True), который соответствует этой сигнатуре, даже если он не делает то, что вы хотите.

+0

Спасибо, Кевин! Это сработало для меня. Я уточню свой вопрос. –

+0

@henriquea: Отлично, рады помочь. Единственное, что нужно отметить, это то, что вы, вероятно, не должны пытаться использовать этот «ModelForm» в других контекстах, так как ваш метод «save()» теперь затеняет «ModelForm.save()». Я только что подал [билет] (https://github.com/pennersr/django-allauth/issues/528) в django-allauth, предлагая изменить имя. –

+0

Хорошо указал Кевин! Тогда я буду искать другую альтернативу. Ура! –

Смежные вопросы