LINUX.ORG.RU

стандартные формы Django

 


0

1

Существует ли инструмент в стандартных формах редактирования и удаления для запрешения их использования не залогинеными пользователями и «чужими» пользователями? Или лучше все-таки самому представления с формами писать?

Нужно: если зашел пользователь c auth_user.id = 12, то он может выполнить правку только той записи из таблицы myapp1_exuserprofile, для которой поле 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__'

С этой формой, пользователь может изменить данные у всех пользователей. А мне нужно, чтобы пользователь менял только свои данные.

Если я тебя правильно понял, то ты про row level permissions - т.е. разрешения на уровне полей таблицы, а не на уровне таблицы целиком?

Если да - то, ЕМНИП, из коробки ничего такого нет. Есть какие-то батарейки, но я выпилил свой велосипед.

CaveRat ★★
()
Ответ на: комментарий от CaveRat

Мне не нужны разрешения. Мне нужно в стандартной форме на базе generic.UpdateView организовать обращение к записи таблицы myapp1_exuserprofile (модель ExUserProfile) с user_id = auth_user.id залогиненого пользователя.

auth_user.id залогиненного пользователя получить как понятно:

User.objects.get( username = self.request.user.get_username() ).id

Но, как в стандартных формах, например, на базе UpdateView выполнять выборку и обновлять именно для залогиненного пользователя - не понятно.

iiivanov314
() автор топика
Ответ на: комментарий от iiivanov314

вот так работает:

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

вроде не залогиненый юсер не сможет вообще что-то подправить, как и залогиненый у другого ) ?

iiivanov314
() автор топика
Ответ на: комментарий от CaveRat

А, что можно по else вернуть, чтобы потом можно было в шаблоне распознать?

class ExUserProfileFormUpdate(generic.UpdateView):
    model = ExUserProfile
    fields = '__all__'
    def get_object(self, queryset=None):
        if self.request.is_authenticated():
             au =  User.objects.get( username = self.request.user.get_username() )
             return ExUserProfile.objects.get( user_id = au.id )
        else:
             return А_что_здесь_вернуть???

шаблон:

<form action="." method="post">{% csrf_token %}
    <table>
    {{ form }}
    <tr>
        <td colspan="2"><input type="submit" value="Готово" /></td>
    </tr>
    </table>
</form>

iiivanov314
() автор топика
Ответ на: комментарий от CaveRat

так это же метод get_object.

'HttpResponse' object has no attribute '_meta'

class ExUserProfileFormUpdate(generic.UpdateView):
    model = ExUserProfile
    fields = '__all__'
    def get_object(self, queryset=None):
        if self.request.is_authenticated():
             au =  User.objects.get( username = self.request.user.get_username() )
             return ExUserProfile.objects.get( user_id = au.id )
        else:
             return HttpResponse(u'Пожалуйста, авторизуйтесь.', status=401)

а например

else:
      redirect('127.0.0.1')

для анонимуса выкидывает пустую форму для заполения, а не перекидывает его на 127.0.0.1 (в идеале сделаю на страницу login)

iiivanov314
() автор топика
Ответ на: комментарий от heilkitty

а в случае отсутствия записи в таблице как лучше поступить?


class ExUserProfileForm(LoginRequiredMixin, TemplateView):
...
            context['ex_profile_for_user'] = ExUserProfile.objects.get( ...)
...

iiivanov314
() автор топика
Ответ на: комментарий от iiivanov314

Не знаю, что именно нужно, но, по идее, имеет смысл выкинуть Http404, чтобы отобразилась 404 страница.

heilkitty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.