Создание формы регистрации Django путем расширения приложения Django-Registation - PullRequest
3 голосов
/ 16 сентября 2011

Пытаюсь создать регистрационную форму, расширив приложение django-registration и используя Django Profile. Я создал модель и форму для профиля, и когда я проверил через оболочку django, он генерирует поля. Для полей профиля я использую ModelForm. Теперь я поражен тем, как объединить поля регистрации django и поля профиля. Ниже приведен код, который я разработал

model.py

class UserProfile(models.Model):
    """
    This class would define the extra fields that is required for a user who will be registring to the site. This model will
    be used for the Django Profile Application
    """
    GENDER_CHOICES = ( 
        ('M', 'Male'),
        ('F', 'Female'),
    )

    #Links to the user model and will have one to one relationship
    user = models.OneToOneField(User)    

    #Other fields thats required for the registration
    first_name = models.CharField(_('First Name'), max_length = 50, null = False)    
    last_field = models.CharField(_('Last Name'),max_length = 50)
    gender = models.CharField(_('Gender'), max_length = 1, choices=GENDER_CHOICES, null = False)    
    dob = models.DateField(_('Date of Birth'), null = False)    
    country = models.OneToOneField(Country)
    user_type = models.OneToOneField(UserType)
    address1 = models.CharField(_('Street Address Line 1'), max_length = 250, null = False)
    address2 = models.CharField(_('Street Address Line 2'), max_length = 250)
    city = models.CharField(_('City'), max_length = 100, null = False)
    state = models.CharField(_('State/Province'), max_length = 250, null = False)
    pincode = models.CharField(_('Pincode'), max_length = 15)
    created_on = models.DateTimeField()
    updated_on = models.DateTimeField(auto_now=True)

forms.py

class UserRegistrationForm(RegistrationForm, ModelForm):

    #resolves the metaclass conflict
    __metaclass__ = classmaker()

    class Meta:
        model = UserProfile
        fields = ('first_name', 'last_field', 'gender', 'dob', 'country', 'user_type', 'address1', 'address2', 'city', 'state', 'pincode')

Теперь, что я должен сделать, чтобы смешать приложение django-registration с моим пользовательским приложением. Я просмотрел множество сайтов и ссылок, чтобы выяснить это, в том числе Django-Registration & Django-Profile, используя вашу собственную пользовательскую форму , но я не уверен, что буду двигаться вперед, тем более, что вместо этого я использую ModelForm.

ОБНОВЛЕНИЕ (26 сентября 2011 г.)

Я внес изменения, как предложено @VascoP ниже. Я обновил файл шаблона и затем из моего view.py создал следующий код

def register(request):
    if request.method == 'POST':        
        form = UserRegistrationForm(request.POST)
        if form.is_valid():
            UserRegistrationForm.save()
    else:
        form = UserRegistrationForm()
    return render_to_response('registration/registration_form.html',{'form' : form}, context_instance=RequestContext(request))

После следующего изменения форма корректно отображается, но проблема в том, что данные не сохраняются. Пожалуйста, помогите мне.

ОБНОВЛЕНИЕ (27 сентября 2011 г.)

UserRegistrationForm.save () был изменен на form.save (). Обновлен код для views.py:

def register(request):
    if request.method == 'POST':        
        form = UserRegistrationForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = UserRegistrationForm()
    return render_to_response('registration/registration_form.html',{'form' : form}, context_instance=RequestContext(request))

Даже после обновления пользователь не сохраняется. Вместо этого я получаю ошибку

У объекта 'super' нет атрибута 'save'

Я вижу, что в классе RegistrationForm нет метода сохранения. Так что мне теперь делать, чтобы сохранить данные? Пожалуйста, помогите

1 Ответ

1 голос
/ 17 сентября 2011

Вам известно, что модель User уже имеет поля first_name и last_name, верно? Кроме того, вы неправильно ввели фамилию в поле last_field.

Я бы посоветовал расширить форму, предоставленную django-registration, и сделать новую форму, которая добавит ваши новые поля. Вы также можете сохранить имя и фамилию непосредственно в пользовательской модели.

#get the form from django-registration
from registration.forms import RegistrationForm

class MyRegistrationForm(RegistrationForm):
    first_name = models.CharField(max_length = 50, label=u'First Name')    
    last_field = models.CharField(max_length = 50, label=u'Last Name')
    ...
    pincode = models.CharField(max_length = 15, label=u'Pincode')


    def save(self, *args, **kwargs):
        new_user = super(MyRegistrationForm, self).save(*args, **kwargs)

        #put them on the User model instead of the profile and save the user
        new_user.first_name = self.cleaned_data['first_name']
        new_user.last_name = self.cleaned_data['last_name']
        new_user.save()

        #get the profile fields information
        gender = self.cleaned_data['gender']
        ...
        pincode = self.cleaned_data['pincode']

        #create a new profile for this user with his information
        UserProfile(user = new_user, gender = gender, ..., pincode = pincode).save()

        #return the User model
        return new_user
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...