2013-06-29 4 views
0

Я пытаюсь использовать django-регистрацию с пользовательским пользователем, но не могу пройти мимо одной маленькой проблемы. Я добавил еще одно поле для пользователя, которое ОТОБРАЖАЕТСЯ в регистрационной форме, но не может СОХРАНИТЬ любые данные. Вот соответствующие коды:django-registration 1.0 сохранение пользовательских полей

models.py

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

class eduuser(AbstractUser): 
    USER_TYPE_CHOICES = (
     #Choices 
) 
    user_type = models.CharField(max_length=3, choices=USER_TYPE_CHOICES) 

forms.py

from registration.forms import RegistrationForm 
from django import forms 
from django.forms import ModelForm 
from .models import eduuser 

class eduuserForm(forms.ModelForm): 
    class Meta: 
     model = eduuser 
     fields = ('user_type',) 

RegistrationForm.base_fields.update(eduuserForm.base_fields) 


class CustomRegistrationForm(RegistrationForm): 
    def save(self, profile_callback=None): 
     user = super(CustomRegistrationForm, self).save(profile_callback=None) 
     edu, c = eduuser.objects.get_or_create(user=user, \ 
      user_type=self.cleaned_data['user_type']) 

urls.py

from posts.forms import CustomRegistrationForm 

urlpatterns = patterns('', 
    url(r'^accounts/register/$', RegistrationView.as_view(
     form_class=CustomRegistrationForm)), 
) 

Проблема, как представляется, в forms.py файле , в частности класс «CustomRegistrationForm». Эта идея исходила из сообщения this, который был для django-registration 0.8.

В любом случае, есть ли какие-либо идеи о том, как сохранить дополнительные пользовательские поля с помощью django-registration 1.0? Любые идеи/предложения/решения помогают!

ответ

2

Ну, я выяснил решение, хотя и грубое. Если у кого-то еще есть аналогичные проблемы в отношении добавления &, сэкономив дополнительные поля пользователя на странице регистрации, предоставленной django-registration 1.0, надеюсь, это будет некоторая помощь ... (хотя я не могу гарантировать, что это действительно сработает для вас)

1) Создайте новую модель пользователя в приложение, добавив дополнительные поля, пожалуйста:

# posts/models.py 
from django.contrib.auth.models import AbstractUser 

class eduuser(AbstractUser): 
    # Created USER_TYPE_CHOICES, omitted here due to length 
    user_type = models.CharField(max_length=3, choices=USER_TYPE_CHOICES) 

2) добавить модель пользователя в файл настроек. Мое приложение происходит называться «должности», поэтому моя модель пользователя:

# appName/settings.py 
AUTH_USER_MODEL = "posts.eduuser" 

3) Отрегулируйте Джанго регистрацию, чтобы иметь дело с новой моделью пользователя. Я сделал изменения замечены here. Это не должно влиять на функциональность django-registration, если вы используете его с другим проектом.

4) Добавьте дополнительное поле (ы) в виде:

# posts/forms.py 
from registration.forms import RegistrationForm 
from django import forms 
from django.forms import ModelForm 
from .models import eduuser 


class eduuserForm(forms.ModelForm): 
    """ 
    Get extra 'user_type' field to add to form for django-registration 
    """ 
    class Meta: 
     model = eduuser 
     fields = ('user_type',) 

RegistrationForm.base_fields.update(eduuserForm.base_fields) 

5) Переопределение RegistrationView. Я не совсем уверен, почему это необходимо, но я получаю ошибки без него. Я считаю, что это говорит: «Эй, модели, будьте готовы к лишнему полю». Это в основном копировать/вставить из регистрации/движков/по умолчанию/views.py, но с дополнительное поле добавлено

# posts/views.py 
from registration.backends.default.views import RegistrationView 
from registration import signals 
from registration.models import RegistrationProfile 
from django.contrib.sites.models import Site 
from django.contrib.sites.models import RequestSite 

class CustomRegistrationView(RegistrationView): 
    """ 
    Needed override this django-registration feature to have it create 
    a profile with extra field 
    """ 
    def register(self, request, **cleaned_data): 
     username, email, password, user_type = cleaned_data['username'], cleaned_data['email'], cleaned_data['password1'], cleaned_data['user_type'] 
     if Site._meta.installed: 
      site = Site.objects.get_current() 
     else: 
      site = RequestSite(request) 
     new_user = RegistrationProfile.objects.create_inactive_user(
      username, email, password, user_type, site) 
     signals.user_registered.send(sender=self.__class__, 
            user=new_user, 
            request=request) 
    return new_user 

6) Обновление модели. Я сделал это, непосредственно редактируя модель регистрации django (так как это проект с одиноким волком, и это мое единственное использование), но НЕ делайте этого, если вы используете django-registration для чего-либо еще. Вы можете попробовать переопределить модель в своем приложении, которое я считаю. В любом случае, в регистрации/models.py я добавил дополнительное поле:

# registration/models.py 
def create_inactive_user(self, username, email, password, user_type, 
         site, send_email=True): 
    """ 
    Create a new, inactive ``User``, generate a 
    ``RegistrationProfile`` and email its activation key to the 
    ``User``, returning the new ``User``. 

    By default, an activation email will be sent to the new 
    user. To disable this, pass ``send_email=False``. 

    """ 
    new_user = get_user_model().objects.create_user(username, email, password, user_type=user_type) 
    new_user.is_active = False 
    new_user.save() 

    registration_profile = self.create_profile(new_user) 

    if send_email: 
     registration_profile.send_activation_email(site) 

    return new_user 

7) Обновление вас URLS файл:

#appName/urls.py 
urlpatterns = patterns('', 
    url(r'^accounts/register/$', CustomRegistrationView.as_view(
    form_class=RegistrationForm)), 
) 

Надеется, что кто, где получает некоторую пользу из этого. Счастливый Django-ing!

2

Кажется, что шаг 3 в ответе chipperdrew больше не нужен. Я обнаружил, что код django-registration уже включает шаги для импорта get_user_model(). Это верно для Джанго-регистрации v1.0

В регистрации/models.py, линии 15-19

try: 
    from django.contrib.auth import get_user_model 
    User = get_user_model() 
except ImportError: 
    from django.contrib.auth.models import User 

Примечание: Я не могу напрямую прокомментировать ответ chipperdrew, чтобы я отправил выше как отдельный ответ.

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