Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 23, 2014 00:14:45

django314
Зарегистрирован: 2014-04-02
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

профиль пользователя

Прошу помочь с организацией перехода пользователя в свой профиль.

После активации django-registration бросает в accounts/profile. Я определил myapp1/profile/идентикатор_user-а, т.к. таблица Profile хранится в моем приложении.

1. Как можно определить id user-а и настроить автоматический переброс accounts/profile -> myapp1/profile/идентикатор_user-а?

2. как ограничить доступ остальных пользователей к myapp1/profile/идентикатор_user-а, кроме user-а с правильным идентификатором?

Офлайн

#2 Апрель 23, 2014 07:49:28

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

профиль пользователя

1. LOGIN_REDIRECT_URL = “/myapp1/profile”
или даже
from django.core.urlresolvers import reverse_lazy
reverse_lazy('profiles')

2. Правильный это какой ?
Я так понял там самописная вюха так и делаейте в ней что хотите.
Или в шаблонах

{% if request.user.pk == profile.user.pk %}
you in 
{% else %}
not accespted 
{% ebdif %}

Офлайн

#3 Апрель 23, 2014 22:24:16

django314
Зарегистрирован: 2014-04-02
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

профиль пользователя

помогите разобраться с вьюхой - ну не идет, чего-то недопонимаю …

нужно сделать выборку из стандартных таблиц модуля авторизации: auth_user (я так понимаю что это модель User) и расширенного профиля myapp1_exuser_profile (с моделью ExUserProfile) всех данных для пользователя который залогинился. Для пользователя, который никак не залогинлся должно вводится предложение залогинится.

Моя попытка:

class UserProfileFormView(generic.DetailView):
def get_context_data(self, *args, **kwargs):
context = super(UserProfileFormView, self).get_context_data(*args, **kwargs)
context['myapp1_exuser_profile'] = ExUserProfile.objects.get( id = request.user.pk )
context['auth_user'] = User.objects.get( user_id = request.user.pk )
return context

но я понимаю, что она не удачна, т.к. не передается id или pk залогиненого пользователя

Отредактировано django314 (Апрель 23, 2014 23:25:05)

Офлайн

#4 Апрель 23, 2014 23:41:58

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

профиль пользователя

django314
покажите модель профиля. У вас же там скорей всего фк на модель пользователя

Я бы просто переписал шаблон профиля что-бы он обращался где нужно к данным с модели пользователя

from django.views.generic import TemplateView
from braces.views import LoginRequiredMixin
class UserProfileFormView(LoginRequiredMixin, TemplateView):
    #optional
    login_url = "/signup/"
    redirect_field_name = "hollaback"
    raise_exception = True

C CBV очень удобно использовать набор миксинов django-braces
http://django-braces.readthedocs.org/en/v1.4.0/access.html#loginrequiredmixin

Офлайн

#5 Апрель 23, 2014 23:51:50

django314
Зарегистрирован: 2014-04-02
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

профиль пользователя

Singularity
django314покажите модель профиля. У вас же там скорей всего фк на модель пользователя

class ExUserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    middle_name = models.CharField(u'Ваше отчество:',max_length=25)
   # другие поля
    def __unicode__(self):
        return self.user


я напутал
        context['myapp1_exuser_profile'] = ExUserProfile.objects.get( user_id = self.request.user.pk )
        context['auth_user'] = User.objects.get( id = self.request.user.pk )

Офлайн

#6 Апрель 24, 2014 00:09:22

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

профиль пользователя

django314
зачем еще auth_user ? ну может быть что так удобней
p = ExUserProfile.objects.get(pk=1)
print p.user.email

https://docs.djangoproject.com/en/dev/ref/models/fields/#ref-onetoone
https://docs.djangoproject.com/en/dev/ref/models/fields/#ref-onetoone
Добавить данные пользователю можно не одним способом
http://stackoverflow.com/questions/21779226/abstractuser-django-full-example

Офлайн

#7 Апрель 24, 2014 00:27:01

django314
Зарегистрирован: 2014-04-02
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

профиль пользователя

Спасибо, буду разбираться.

Singularity
django314зачем еще auth_user ?



я из документации django-registration взял примеры. для модели User автоматом создается таблица auth_user..

class ExUserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    middle_name = models.CharField(u'Отчество: ',max_length=25)
   # другие поля
    def __unicode__(self):
        return self.user
from registration.signals import user_registered
def user_registered_callback(sender, user, request, **kwargs):
    profile = ExUserProfile(user = user)
    profile.middle_name = request.POST['middle_name']
    # другие поля
    profile.save()
user_registered.connect(user_registered_callback)
from registration.forms import RegistrationForm
from django import forms
class ExUserRegistrationForm(RegistrationForm):
    username = forms.CharField(label = u'Логин:')
    first_name = forms.CharField(label = u'Имя:')
    middle_name = forms.CharField(label = u'Отчество:')
    last_name = forms.CharField(label = u'Фамилия:')
    # другие

правла здесь конкретный косяк: не сохраняются значения стандатных для auth_user полей: last_name и first_name. А поля профиля ExUserProfile сохраняются без сбоев.

mysql> show fields from auth_user;
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| password | varchar(128) | NO | | NULL | |
| last_login | datetime | NO | | NULL | |
| is_superuser | tinyint(1) | NO | | NULL | |
| username | varchar(30) | NO | UNI | NULL | |
| first_name | varchar(30) | NO | | NULL | |
| last_name | varchar(30) | NO | | NULL | |
| email | varchar(75) | NO | | NULL | |
| is_staff | tinyint(1) | NO | | NULL | |
| is_active | tinyint(1) | NO | | NULL | |
| date_joined | datetime | NO | | NULL | |
+--------------+--------------+------+-----+---------+----------------+

mysql> show fields from myapp1_exuserprofile;
+-------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user_id | int(11) | NO | UNI | NULL | |
| middle_name | varchar(100) | NO | | NULL | |
...

Отредактировано django314 (Апрель 24, 2014 00:31:13)

Офлайн

#8 Апрель 24, 2014 00:36:05

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

профиль пользователя

django314
я про то зачем он в контексте шаблона…

Офлайн

#9 Апрель 24, 2014 00:46:11

django314
Зарегистрирован: 2014-04-02
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

профиль пользователя

Singularity
django314я про то зачем он в контексте шаблона…

так Фамилию и Имя извлечь, и чтобы была возможность их править.

+ возможность пароль сменить

Отредактировано django314 (Апрель 24, 2014 00:48:24)

Офлайн

#10 Апрель 24, 2014 01:52:07

django314
Зарегистрирован: 2014-04-02
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

профиль пользователя

Собственно заработало предствление на базе TemplateView, вот так

 def get_context_data(self, *args, **kwargs):
        context = super(ExUserProfileFormView, self).get_context_data(*args, **kwargs)
        if self.request.user.is_authenticated():
            context['exuserprofile'] = ...
           ....
        else:
           ...
        return context

Но, не могу теперь как проверить можно ли разрешить править данные или нет в стандартных формах создания, редактирования и удаления. Например, любой пользователь (в том числе и анонимус) может подправить информацию для любого другого пользователя:
class ExUserProfileFormUpdate(generic.UpdateView):
    model = ExUserProfile
    fields = '__all__'

Отредактировано django314 (Апрель 24, 2014 12:31:49)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version