Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 5, 2009 22:18:19

boh
От:
Зарегистрирован: 2009-12-05
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширенная модель User и django-registration

Естественно, полей 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. Всё работает, но мне очень не нравится такой способ.
Как можно достичь того же, не правя саму библиотеку?



Офлайн

#2 Дек. 5, 2009 22:56:53

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Расширенная модель User и django-registration

видимо никак, пока такой фнукционал не появится в самой библиотеке =(



Офлайн

#3 Дек. 6, 2009 11:56:31

Alexandr
От:
Зарегистрирован: 2009-11-08
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширенная модель User и django-registration

а почему не подходит такое решение?
http://www.djbook.ru/text/profile_inheritance/



Офлайн

#4 Дек. 6, 2009 16:02:00

boh
От:
Зарегистрирован: 2009-12-05
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширенная модель User и django-registration

Alexandr
а почему не подходит такое решение?
http://www.djbook.ru/text/profile_inheritance/
Спасибо. Находил начало этой статьи, оттуда и взял идею наследования User.
Похоже, этот её вариант как-раз подойдёт.



Офлайн

#5 Дек. 7, 2009 00:43:50

boh
От:
Зарегистрирован: 2009-12-05
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширенная модель User и django-registration

Нет, видимо я ошибся. 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, который будет создавать запись нужного типа в базе.
Вопрос в том, как написать свой бэкэнд.



Отредактировано (Дек. 7, 2009 01:25:49)

Офлайн

#6 Дек. 9, 2009 20:00:14

boh
От:
Зарегистрирован: 2009-12-05
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширенная модель User и django-registration

Разобрался. Вопросов больше нет.
Не буду описывать решение из-за его громоздкости и неуниверсальности.



Офлайн

#7 Март 13, 2010 11:28:28

Чел_вТапКах
От:
Зарегистрирован: 2009-07-22
Сообщения: 92
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширенная модель User и django-registration

попробуй зайти в models.py в registration и заменить там стандартного User на вашего UserProfile , у меня заработало!



Офлайн

#8 Март 13, 2010 11:50:51

boh
От:
Зарегистрирован: 2009-12-05
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Расширенная модель User и django-registration

Чел_вТапКах
попробуй зайти в models.py в registration и заменить там стандартного User на вашего UserProfile , у меня заработало!
Это не очень хорошо с точки зрения архитектуры. А если придётся обновить версию django-registration? Снова править его исходники?
Мой вариант лежит здесь: http://bitbucket.org/boh/agency-site/src/tip/accounts/
На сам проект agency-site прошу не обращать внимания - это просто мой первый опыт в django.
В моём решении есть один нюанс. При создании таблицы User в базе не нужно создавать суперпользователя - автоматически создастся запись типа User. Лучше самому зайти в dbshell и создать объект типа UserProfile, в который включается User. Ну, естественно, сделать его суперюзером и задать пароль можно через тот же шелл.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version