Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 24, 2014 02:56:01

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

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

django314
так есть же self.user.id.

Или профили не N к N по иду, а как-то по-особому ?

вот тут надо
user = models.ForeignKey(User, related_name=“profile”)

и в инстанса User будет атрибут profile который и будет связанным профилем

Офлайн

#2 Апрель 24, 2014 13:10:03

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

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

не заметил второй страницы :-)

В стандартных формах редактирования и удаления есть инструмент для запрешения
их использования не залогинеными пользователями и “чужими” пользователями? Или лучше всетаки
самому представления с формами писать?


Например, если зашел пользователь c auth_user.id = 12, то он может выполнить правку
только той записи, для которой поле user_id=12.

Табличка с профилем так выглядит:

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 | |
| first_name | varchar(100) | NO | | NULL | |
...

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

Офлайн

#3 Апрель 24, 2014 13:37:52

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

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

django314
просто сделать url “profile/edit” и выбирать модель на основании self.user.id
надо только в UpdateView переназначить один метод

def get_object(self, queryset=None):
        return self.request.user
вся вьюха
class ExUserProfileFormUpdate(LoginRequiredMixin, generic.UpdateView):
    login_url = "/signup/"
    form_class  = ExUserRegistrationForm
    fields = '__all__'
    def get_object(self, queryset=None):
            return self.request.user

Офлайн

#4 Апрель 24, 2014 15:22:11

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

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

Singularity
django314просто сделать url “profile/edit” и выбирать модель на основании self.user.id надо только в UpdateView переназначить один метод

1. как я понял нужно доставить braces, скачал django-braces-1.4.0.tar.gz (https://pypi.python.org/pypi/django-braces/), распаковал, sudo python setup.py install - успешно отработал, >>> import braces загружается.

при этом код “from braces.views import LoginRequiredMixin” вызывает ошибку “No module named braces.views”

2. ExUserRegistrationForm - это фома для регистрации user? Зачем она в update?

3. def get_object(self, queryset=None):
return self.request.user

заставляет форму сохранять в с auth_user а не в myapp1_exuserprofile (несмотря на model = ExUserProfile) - это, вообще не понятно.



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

Офлайн

#5 Апрель 24, 2014 15:59:50

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

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

django314
вот вы берете и генерируете форму по модели профиля и у вам надо еще редактировать имя которое в другой модели. Что надо сделать? Надо в эту форму добавить

class UserUpdateForm(RegistrationForm):
    username = forms.CharField(label = u'Логин:')
    first_name = forms.CharField(label = u'Имя:')
    class Meta:
        model = ExUserProfile
Надо помнить что форма это отдельная сущность и она валидируется отдельно.
Когда пользователь введет все правильно надо это сохранить в отдельную модель. Это можно сделать дополнив метод form_valid в вьюхе
class ExUserProfileFormUpdate(LogiRequiredMixin, generic.UpdateView):
    def form_valid(self, form):
        # тут сохраняем
        return super(ExUserProfileFormUpdate, self).form_valid(form)
Посмотрите через дебагер что там в self и form

Офлайн

#6 Апрель 24, 2014 22:29:46

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

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

Ура! Пошло!

одна таблица:

class ExUserProfileFormUpdate(generic.UpdateView):
    model = ExUserProfile
    fields = '__all__'
    def get_object(self, queryset=None):
             auth_user =  User.objects.get( username = self.request.user.get_username() )
             return ExUserProfile.objects.get( user_id = auth_user.id )



правда mixin-ы пока не осмыслил

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version