Найти - Пользователи
Полная версия: Расширенная модель User и django-registration
Начало » Django » Расширенная модель User и django-registration
1
boh
Естественно, полей User недостаточно в большинстве случаев. Добавил необходимые поля путём наследования от User
from django.db import models
from django.contrib.auth.models import User, UserManager

class UserProfile(User):
GENDER_CHOICES = (
('M', 'Male'),
('F', 'Female'),
)
gender = models.CharField(blank=True, max_length=1, choices=GENDER_CHOICES)
birthday = models.DateField(null=True, blank=True)
growth = models.IntegerField(null=True, blank=True)
weight = models.IntegerField(null=True, blank=True)
photo = models.ImageField(upload_to = "/photos/", null=True, blank=True)
description = models.TextField(blank=True)

objects = UserManager()
Возникает закономерный вопрос. Как заставить сторонние приложения вроде django-registration использовать мой UserProfile вместо User? Пока решил вопрос, скопировав приложение django-registration в свой проект. Подправил форму (дополнительные поля при регистрации) и заменил все упоминания User на UserProfile. Всё работает, но мне очень не нравится такой способ.
Как можно достичь того же, не правя саму библиотеку?
regall
видимо никак, пока такой фнукционал не появится в самой библиотеке =(
Alexandr
а почему не подходит такое решение?
http://www.djbook.ru/text/profile_inheritance/
boh
Alexandr
а почему не подходит такое решение?
http://www.djbook.ru/text/profile_inheritance/
Спасибо. Находил начало этой статьи, оттуда и взял идею наследования User.
Похоже, этот её вариант как-раз подойдёт.
boh
Нет, видимо я ошибся. django-registration по-прежнему создаёт запись только в таблице Users.
Нашёл на Хабре некоторые идеи по этому поводу: http://habrahabr.ru/blogs/django/74165/
Предлагается добавлять свой URL вида:
url(r'/register', 'registration.views.register', {'form': RegistrationFormUniqueEmail}, name='registration_register'),
А учитывая интерфейс основных методов registration,
def register(request, backend, success_url=None, form_class=None,
disallowed_url='registration_disallowed',
template_name='registration/registration_form.html',
extra_context=None):
или
def activate(request, backend,
template_name='registration/activate.html',
success_url=None, extra_context=None, **kwargs):
видимо, им можно передать свой backend, который будет создавать запись нужного типа в базе.
Вопрос в том, как написать свой бэкэнд.
boh
Разобрался. Вопросов больше нет.
Не буду описывать решение из-за его громоздкости и неуниверсальности.
Чел_вТапКах
попробуй зайти в models.py в registration и заменить там стандартного User на вашего UserProfile , у меня заработало!
boh
Чел_вТапКах
попробуй зайти в models.py в registration и заменить там стандартного User на вашего UserProfile , у меня заработало!
Это не очень хорошо с точки зрения архитектуры. А если придётся обновить версию django-registration? Снова править его исходники?
Мой вариант лежит здесь: http://bitbucket.org/boh/agency-site/src/tip/accounts/
На сам проект agency-site прошу не обращать внимания - это просто мой первый опыт в django.
В моём решении есть один нюанс. При создании таблицы User в базе не нужно создавать суперпользователя - автоматически создастся запись типа User. Лучше самому зайти в dbshell и создать объект типа UserProfile, в который включается User. Ну, естественно, сделать его суперюзером и задать пароль можно через тот же шелл.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB