2015-04-14 2 views
5

7 и python 2.7. Я хочу добавить дополнительное поле в регистрацию django. я пытаюсь расширить с моей модели, как это:django-registration-redux добавить дополнительное поле

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?

благодаря

+0

Вы можете увеличить или заменить стандартную модель Django 'django.contrib.auth.models.User'. Просмотрите документацию: [«подменять пользовательскую модель пользователя»] (https://docs.djangoproject.com/en/1.8/topics/auth/customizing/) –

+0

Кроме того, модель пользователя уже имеет [адрес электронной почты] (https : //docs.djangoproject.com/en/1.5/ref/contrib/auth/#django.contrib.auth.models.User.email) и [get_full_name] (https://docs.djangoproject.com/ ru/1.5/ref/contrib/auth/# django.contrib.auth.models.User.get_full_name) метод, который «Возвращает первое имя плюс последнее имя с пробелом между ними.« –

ответ

7

работы Это для меня:
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) 

forms.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'), 
] 
+0

Я получал ошибку, используя ваш код напрямую. Я получил его для работы, возвратив класс' new_user' (вместо 'user_profile') из функции' register'. – sudshekhar

+0

В документах Django предлагается использовать OneToOneField. Смотрите: https: //docs.djangoproject.com/en/1.8/topics/auth/customizing/#extending-the-existing-user-model –

4

Я нашел способ сделать это! (The last answer кидал мне некоторые ошибки) Позвольте мне объяснить: (Django 1.10.5 и Django-учетно-перевождь 1,4)

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

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

приложения/формы. ру:

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


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

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

приложения/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 

корень/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'))] 

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

+1

Я не очень хорошо знаком с Django, но это выглядит ** очень ** похоже на 18 Вы можете указать, как это отличается от существующего ответа. – miken32

+1

Решение Dima Kudosh имеет проблемы с regbackend.py. Переопределение регистратора было неправильным. Позвольте мне отредактировать мой ответ и объяснить его лучше – rvliscano