Sat 3 May 2008
В транк добавлен бранч Queryset-refactor, который позволяет легко наследовать модели Django, об этом уже давно всем известно. Но наследование - не единственная альтернатива, можно применять Monkey patching.
Главная идея в том, что Monkey patching также позволяет добавлять не только поля, но и функции.
Например, так для модели User добавляю поле OpenID, и еще дополнительную функцию, возвращающую ник, если имя не задано
не создаются дополнительные таблицы
работа с моделью осуществляется всеми стандартными средствами Django.
Главная идея в том, что Monkey patching также позволяет добавлять не только поля, но и функции.
Например, так для модели User добавляю поле OpenID, и еще дополнительную функцию, возвращающую ник, если имя не задано
from django.contrib.auth.models import User
User.add_to_class('openid', models.CharField(max_length=250,blank=True))
def get_user_name(self):
if self.first_name or self.last_name:
return self.first_name + " " + self.last_name
return self.username
User.add_to_class("get_user_name",get_user_name)
Явные плюсы метода:не создаются дополнительные таблицы
работа с моделью осуществляется всеми стандартными средствами Django.
English
Deutsch
Русский

May 4th, 2008 at 10:24 a.m.
Но при этом нужно вручную создавать в БД поле для 'openid'?
P.S. Можно тут как-то подписаться на комменты?
May 4th, 2008 at 12:50 p.m.
Вручную создавать, конечно, не надо, все поля автоматически создаются при первом syncdb. Если модель User уже есть, то конечно syncdb тут не поможет и тогда путь - вручную.
Пы.Сы. Пока подписки нет, все руки не доберутся :(
Скоро собираюсь кардинально переделать движок...
May 6th, 2008 at 3:14 p.m.
Подскажите, как сделать так, что бы эти поля были доступны для редактирование через админку?
May 6th, 2008 at 4:54 p.m.
Например, так (там же, просто дописать ниже):
User._meta.admin.fields += (('Custom Fields', {'fields': ('openid',)}),)
User._meta.admin.list_display += ('openid',)
May 6th, 2008 at 5:55 p.m.
Спасибо )) Но обнаружил странное поведение системы:
код:
from django.contrib.auth.models import User
User.add_to_class('department',models.CharField(max_length=250,blank=True))
User.add_to_class('position',models.CharField(max_length=250,blank=True))
User._meta.admin.fields += (('Custom', {'fields': ('department','position',)}),)
User._meta.admin.list_display += ('department','position',)
в итоге два поля добавились дважды в таблицу вывода http://localhost:8000/admin/auth/user/ и так же дважды появились при редактировании пользователя
May 6th, 2008 at 6:23 p.m.
1) используется SVN?
2) в каком файле это добавление? нет ли такого же дубликата еще в других местах? этот код надо прописывать только в одном (любом) models.py. Может проблема в этом...
May 7th, 2008 at 1:02 p.m.
1. да свн билд 7519
2. все так и сделано в models.py один раз
May 7th, 2008 at 4:02 p.m.
У меня не дублируются поля, вставил сейчас твой код, тоже все отработало как надо, странно, может, что лишнее в остальном коде... когда не видишь, трудно что определенное сказать....
May 13th, 2008 at 3:51 p.m.
Сорри, чт пишу в камменте, но не нашел нигде на сайте инфы. А как с вами связаться? Есть вопрос на тему статьи про Django.
May 13th, 2008 at 4:07 p.m.
есть вверху форма Contact, или на мыло alrond @ gmail [.] com
May 19th, 2008 at 12:55 a.m.
вообще-то и раньше можно было свои методы к чужим моделям прикручивать:
def _get_userdomain(self):
domain = Site.objects.get_current().domain
return unicode('http://%s.%s' % (self.username, domain))
User.userdomain = property(_get_userdomain)