Форум сайта python.su
Почав вчити 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)
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})
Офлайн
speak no hrenovo
Офлайн
molodec !
P.S. читай документацію :)
Офлайн
а можна ссилку, бо не найшов,то і рішив тут спитати
Офлайн
djangoproject.com :)
а так вже ніби книженція вийшла по джанго …
Офлайн
В Маньяка в блозі добре описаний такий випадок і пропонується 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
Офлайн
Напевно я не можу замітити щось валиве, бо коли я переписую модель по вашому зразку появляється там сама помилка
Офлайн
Офлайн
каже, шо такий профільне найдений, і як мені зробити, щоб для одного користувача був один профільякщо не звертати уваги на AutoOneToOneField() метод, то треба робити наступним чином:
unique=True
from django.contrib.auth.models import User
class UserProfile(models.Model):
name = models.ForeignKey(User, unique=True)
...
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)
from django.conf.urls.defaults import *
urlpatterns = patterns('',
# Another urls
(r'^account/$', 'views.account'),
(r'^accounts/(?P<username>[^/]+)/$', 'views.profile'),
)
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))
Офлайн