Найти - Пользователи
Полная версия: User Profile
Начало » Django » User Profile
1
pikovit
Почав вчити 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})
каже, шо такий профільне найдений, і як мені зробити, щоб для одного користувача був один профіль
pikovit
speak no hrenovo
Gnat
molodec !
P.S. читай документацію :)
pikovit
а можна ссилку, бо не найшов,то і рішив тут спитати
Gnat
djangoproject.com :)
а так вже ніби книженція вийшла по джанго …
diadya_vova
В Маньяка в блозі добре описаний такий випадок і пропонується 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
pikovit
Напевно я не можу замітити щось валиве, бо коли я переписую модель по вашому зразку появляється там сама помилка
LMZ
насколько я понял, вот
http://www.djangoproject.com/documentation/authentication/#storing-additional-information-about-users
playpauseandstop
каже, шо такий профільне найдений, і як мені зробити, щоб для одного користувача був один профіль
якщо не звертати уваги на 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))
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