django-registration-redux добавить дополнительное поле

7 и питон 2.7. я хочу добавить дополнительное поле в регистрацию django. я пытаюсь расширить свою модель следующим образом:

class Seller(models.Model):
user            = models.ForeignKey(User, unique=True)
name            = models.CharField(max_length=25)
phone_number    = models.BigIntegerField()
email           = models.EmailField(max_length=75)

def __str__(self):
    return self.name;

и я добавляю form.py вот так

    from django import forms
    from registration.forms import RegistrationForm
    from django.forms import ModelForm
    from django.contrib.auth.models import User
    from kerajinan.models import Product, Category, Seller

    class SellerForm(forms.ModelsForm):
        class Meta:
            model   = Seller
            fields  = ('name','phone_number','email')

и измените url.py следующим образом:

url(r'^accounts/', 'registration.views.register',{'form_class':SellerForm,'backend': 'registration.backends.default.DefaultBackend'})

как использовать эту модель с регистрацией django, и я получаю синтаксис ошибки с моим ulr.py?

Спасибо


person User0511    schedule 14.04.2015    source источник
comment
Вы можете дополнить или заменить стандартную модель Django django.contrib.auth.models.User. Посмотрите документацию: замена пользовательской модели пользователя   -  person Timmy O'Mahony    schedule 14.04.2015
comment
Кроме того, модель User уже имеет адрес электронной почты и get_full_name, который возвращает first_name плюс last_name с пробелом между ними.   -  person Mick T    schedule 26.08.2015


Ответы (2)


У меня работает:
models.py

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

class UserProfile(models.Model):
    field = models.CharField(max_length=3)
    user = models.OneToOneField(User)

формы.py

from registration.forms import RegistrationFormUniqueEmail
from django import forms

class UserProfileRegistrationForm(RegistrationFormUniqueEmail):
    field = forms.CharField()

Создайте regbackend.py и напишите:

from registration.backends.default.views import RegistrationView
from forms import UserProfileRegistrationForm
from models import UserProfile

class MyRegistrationView(RegistrationView):

    form_class = UserProfileRegistrationForm

    def register(self, request, form_class):
        new_user = super(MyRegistrationView, self).register(request, form_class)
        user_profile = UserProfile()
        user_profile.user = new_user
        user_profile.field = form_class.cleaned_data['field']
        user_profile.save()
        return user_profile

И urls.py

from django.conf.urls import include, url
import regbackend

urlpatterns = [
url(r'^accounts/register/$', regbackend.MyRegistrationView.as_view(), name='registration_register'),
]
person Dima Kudosh    schedule 31.07.2015
comment
Я получал ошибку, используя ваш код напрямую. Я заставил его работать, вернув класс new_user (вместо user_profile) из функции register. - person sudshekhar; 15.08.2015
comment
Документы Django предлагают использовать OneToOneField. См.: docs.djangoproject.com /ru/1.8/topics/auth/настройка/ - person Mick T; 26.08.2015

Я нашел способ сделать это! (Последний ответ выдал мне несколько ошибок) Позвольте мне объяснить это: (Django 1.10.5 и Django-registration-redux 1.4)

приложение/models.py:

class Profile(models.Model):
    user = models.OneToOneField(User, primary_key=True)
    passport_id = models.IntegerField(max_length=10)

приложение/forms.py:

from registration.forms import RegistrationFormUniqueEmail
from django import forms
from .models import Profile


class ProfileForm(RegistrationFormUniqueEmail):
    passport = forms.IntegerField(max_length=10)

Затем я создал знаменитый файл regbackend.py. Обратите внимание, что метод register принимает только один параметр (форму). Вам нужно не забыть создать и сохранить новый объект (запись) в таблице модели БД, как я делаю в следующем коде:

приложение/regbackend.py

from registration.backends.default.views import RegistrationView
from .forms import ProfileForm
from .models import Profile


class MyRegistrationView(RegistrationView):

    form_class = ProfileForm

    def register(self, form_class):
        new_user = super(MyRegistrationView, self).register(form_class)
        p = form_class.cleaned_data['passport']
        new_profile = Profile.objects.create(user=new_user, passport=p)
        new_profile.save()
        return new_user

root/urls.py

from app.regbackend import MyRegistrationView


urlpatterns = [
    url(r'^accounts/register/$', MyRegistrationView.as_view(),
        name='registration_register'),
    url(r'^accounts/', include('registration.backends.default.urls'))]

После этого вы можете настроить некоторые другие вещи для поля (проверки и т. д.)

person revliscano    schedule 25.01.2017
comment
Я не очень хорошо знаком с Django, но это выглядит очень похоже на ответ 18-месячной давности. Вы можете указать, чем это отличается от существующего ответа. - person miken32; 26.01.2017
comment
Решение Димы Кудоша имеет проблемы в regbackend.py. Переопределение метода регистрации было неверным. Позвольте мне отредактировать мой ответ и объяснить его лучше - person revliscano; 26.01.2017