Найти - Пользователи
Полная версия: Расширение модели User
Начало » Django » Расширение модели User
1 2 3
LestatCheb
Ferroman
А что, не работает?
Насамом деле профит от такого трюка сомнительный. Если вызовы get_profile() засовывать в в обработчики исключений то проблем не будет.
наверное работает,
просто полных примеров про регистрацию с расширенной моделью юзера найти что-то не могу,
чтобы описали как форму сделали с проверкой и проверкой условий на расширенные поля… (т.е. из расширенных полей есть обязательные для заполнения)
и как используется этот get_profile()

пока стандартную форму запихал, работает
def users_register(request):
form = UserCreationForm(request.POST)
if form.is_valid():
new_user = form.save()
return HttpResponseRedirect("/")
else:
form = UserCreationForm()
return render_to_response("registration/register.html", {
'form': form,
})
сейчас смотрю
http://docs.djangoproject.com/en/dev/topics/forms/modelforms/
там можно стандартную форму расширить,
т.е. это надо стандартную джанговскую UserCreationForm расширить в свою форму?
в этом направлении надо копать или есть другой способ?

спасибо.
Ferroman
просто полных примеров про регистрацию с расширенной моделью юзера найти что-то не могу,
django-profile?
PyKaB
Ferroman
А расширить стандартного юзера с использованием AUTH_PROFILE_MODULE почему не подходит?
хочется управлять профилем и пользователем в админке в одной моделе.
вопрос решил, но не красиво да и вообще не правильно - пришлось патчить UserAdmin в django.contrib.auth.admin :(
poltergeist
Зачем патчить UserAdmin? джанга достаточно расширяема:
# file admin.py in your application
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

class MyUserAdmin(UserAdmin):
add_form = MyUserCreationForm

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
sv0
Расширил модель User воспользовавшись советом slav0nic:
slav0nic
лучше сделайте профиль и свяжите его с User через AutoOnetoOneField (находится в гугле:])
и статьей Ивана Сагалаева:
http://softwaremaniacs.org/blog/2007/03/07/auto-one-to-one-field/

#models.py
from wap.fields import AutoOneToOneField

class Profile(models.Model):
user = AutoOneToOneField(User, related_name='profile', verbose_name=_('User'))

gender = models.CharField(max_length=1, choices=GENDER_CHOICES, blank=True)
birth_date = models.DateField(blank=True, null=True)
country = models.ForeignKey(Country, null=True, blank=True)
city = models.ForeignKey(City, null=True, blank=True)
#fields.py
from django.db.models import OneToOneField
from django.db.models.fields.related import SingleRelatedObjectDescriptor
class AutoSingleRelatedObjectDescriptor(SingleRelatedObjectDescriptor): # this line just can't be too long, right?
def __get__(self, instance, instance_type=None):
try:
return super(AutoSingleRelatedObjectDescriptor, self).__get__(instance, instance_type)
except self.related.model.DoesNotExist:
obj = self.related.model(**{self.related.field.name: instance})
obj.save()
return obj

class AutoOneToOneField(OneToOneField):
'''
OneToOneField, которое создает зависимый объект при первом обращении
из родительского, если он еще не создан.
'''
def contribute_to_related_class(self, cls, related):
setattr(cls, related.get_accessor_name(), AutoSingleRelatedObjectDescriptor(related))
#if not cls._meta.one_to_one_field:
# cls._meta.one_to_one_field = self
LestatCheb
я так сделал

models.py:
from django.db import models
from django.contrib.auth.models import User, UserManager
from django.db.models import signals

class UserProfile(User):
gender = models.CharField(max_length=1, choices=GENDER_CHOICES, help_text=u'Выберите пол', verbose_name='Пол')
education = models.ForeignKey(Education, verbose_name='Образование',null=True, blank=True)
kinship = models.ForeignKey(UserKinship, verbose_name='Родственное положение',null=True, blank=True)
rating = models.IntegerField(default=0, null=True, blank=True)
age = models.DateField('Дата Рождения',null=True, blank=True)
objects = UserManager()

def create_profile_for_user(sender, **kwargs):
if kwargs['created']:
p = UserProfile() # 'UserProfile' is my custom User model
p.__dict__.update(kwargs['instance'].__dict__)
p.save()

signals.post_save.connect(create_profile_for_user, sender=User)
settings.py:

AUTH_PROFILE_MODULE = "base.UserProfile"
admin.py:


from django.contrib.auth.models import User

from django.db import models
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from base.models import UserProfile, UserContacts

class ProfileInline(admin.StackedInline):
model = UserProfile
extra = 2
max_num = 2


class ProfileAdmin(admin.ModelAdmin):

inlines = (ProfileInline,UserContactsInline,)


admin.site.unregister(User)
admin.site.register(User, ProfileAdmin)
правда в админке наверху обычный User выводится, а потом уже расширенный, но это не сильно напрягает.
qman
poltergeist
Зачем патчить UserAdmin? джанга достаточно расширяема:
Код:
# file admin.py in your application
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

class MyUserAdmin(UserAdmin):
add_form = MyUserCreationForm

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
спасибо!
Iraqez
LestatCheb
я так сделал
Извините, а как вы боролись с полем вставки пароля? А то у меня форма смены пароля на 404 выкидывает, а отдельно для этого дела в urls.py лезть как то не очень…
devalentino
Тут не про расширемие модели User но про расширение моделей в целом
FishHook
devalentino,
Модератор: Прекратите спамить, пока по-хорошему прошу.
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