Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 19, 2007 22:05:24

pikovit
От:
Зарегистрирован: 2007-12-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

User Profile

Почав вчити Django а вчитись треба на реальних проектах. Потрібно доповнити стандартну джанговську базу користувачів
models.py

from django.contrib.auth.models import User

class UserProfile (models.Model):
user = models.OneToOneField(User)
first_name = models.CharField(maxlength=30)
last_name = models.CharField(maxlength=30);
email = models.EmailField()
birthday = models.DateField()
last_visit = models.DateTimeField()
def __self__ (self):
return "%s," % (self.user)
views.py
from django.shortcuts import get_object_or_404, render_to_response
from accounts.models import UserProfile

def profile(request, user):
profile = get_object_or_404(UserProfile, user = user)
return render_to_response('accounts/account_view.html',
{'profile': profile})
каже, шо такий профільне найдений, і як мені зробити, щоб для одного користувача був один профіль



Офлайн

#2 Дек. 20, 2007 10:52:00

pikovit
От:
Зарегистрирован: 2007-12-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

User Profile

speak no hrenovo



Офлайн

#3 Дек. 20, 2007 12:47:32

Gnat
От:
Зарегистрирован: 2007-06-26
Сообщения: 83
Репутация: +  0  -
Профиль   Отправить e-mail  

User Profile

molodec !
P.S. читай документацію :)



Офлайн

#4 Дек. 20, 2007 17:38:39

pikovit
От:
Зарегистрирован: 2007-12-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

User Profile

а можна ссилку, бо не найшов,то і рішив тут спитати



Офлайн

#5 Дек. 21, 2007 10:43:55

Gnat
От:
Зарегистрирован: 2007-06-26
Сообщения: 83
Репутация: +  0  -
Профиль   Отправить e-mail  

User Profile

djangoproject.com :)
а так вже ніби книженція вийшла по джанго …



Офлайн

#6 Дек. 21, 2007 10:48:12

diadya_vova
От:
Зарегистрирован: 2007-11-03
Сообщения: 41
Репутация: +  0  -
Профиль   Отправить e-mail  

User Profile

В Маньяка в блозі добре описаний такий випадок і пропонується AutoOneToOneField().
http://softwaremaniacs.org/blog/2007/03/07/auto-one-to-one-field/

Це краще за OneToOneField() тим, що профіль (якщо він ще не створений) при зверненні
створюється автоматично.

Буде виглядати приблизно так:

#——————————————————————————
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.show_customers = True
obj.show_projects = True
obj.show_tasks = True
obj.tasks_shared = False
obj.share_users = “”
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

#——————————————————————————
class Profile(models.Model):
“”“
User's profile
”“”
user = AutoOneToOneField(User, related_name=“profile”, editable=False)



openid = models.CharField(maxlength=“200”, blank=True)
share_users = models.TextField()

def __str__(self):
return self.user.username

def __unicode__(self):
return self.user.username

class Meta:
verbose_name = “User's profile”
verbose_name_plural = “User's profiles”

class Admin:
pass



Офлайн

#7 Дек. 22, 2007 15:09:00

pikovit
От:
Зарегистрирован: 2007-12-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

User Profile

Напевно я не можу замітити щось валиве, бо коли я переписую модель по вашому зразку появляється там сама помилка



Офлайн

#8 Дек. 23, 2007 11:08:45

LMZ
От:
Зарегистрирован: 2007-12-16
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Офлайн

#9 Дек. 24, 2007 23:16:41

playpauseandstop
От:
Зарегистрирован: 2007-10-31
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

User Profile

каже, шо такий профільне найдений, і як мені зробити, щоб для одного користувача був один профіль
якщо не звертати уваги на AutoOneToOneField() метод, то треба робити наступним чином:

1. Умова Один користувач = Один профіль виконується додаванням атрибуту
unique=True
до UserProfile.user, тобто:
models.py
from django.contrib.auth.models import User

class UserProfile(models.Model):
name = models.ForeignKey(User, unique=True)
...
2. Профіль і не буде найденний, тому що в данному випадку ви повинні передавати параметром user не ім'я юзера, а об'єкт юзера, вже створенний до цього. Тобто для такого методу потрібно писати наступним чином
views.py
from django.shortcuts import get_object_or_404, render_to_response
from models import UserProfile

def profile(request, user):
pr = get_object_or_404(UserProfile, user__name = user)
return render_to_response('/path/to/template', {'profile': pr}, context_instance = RequestContext(request)
Але, на мій смак, набагато ефектнивніше буде скористатися порадами 12 розділу ДжангаБуку, де сказано про AUTH_PROFILE_MODULE опцію для проекту, та про User.get_profile() метод.

Плюс розподілити логіку для перегляду профіля юзера, який вже аутентифікований, та всіх інших.

urls.py
from django.conf.urls.defaults import *

urlpatterns = patterns('',
# Another urls
(r'^account/$', 'views.account'),
(r'^accounts/(?P<username>[^/]+)/$', 'views.profile'),
)
views.py
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, render_to_response

@login_required
def account(request):
return render_to_response('/path/to/account.html', {
'page_profile': request.user.get_profile(),
'page_user': request.user, # Don't override standart RequestContext `user` attr
}, context_instance = RequestContext(request))

def profile(request, username):
user = get_object_or_404(User, username = username)
return render_to_response('/path/to/account.html', {
'page_profile': user.get_profile(),
'page_user': user,
}, context_instance = RequestContext(request))



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version