Найти - Пользователи
Полная версия: профиль пользователя
Начало » Django » профиль пользователя
1 2
Singularity
django314
так есть же self.user.id.

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

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

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

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


Например, если зашел пользователь 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__'
С этой формой, пользователь может изменить данные у всех пользователей. А мне нужно, чтобы пользователь менял
только свои данные.
Singularity
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
django314
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) - это, вообще не понятно.



Singularity
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
django314
Ура! Пошло!

одна таблица:
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-ы пока не осмыслил
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