Updateview не ограничивается только идентификатором вошедшего в систему пользователя - PullRequest
0 голосов
/ 26 февраля 2019

Я использую UpdateView, но мне нужно только, чтобы, когда пользователь, который вошел в систему, мог измениться, просто его фотография.Как и сейчас, если я набираю в браузере http://127.0.0.1:8000/change-photo/26/, это меняет фотографию пользователя 26, хотя я вошел в систему с пользователем 12, я хочу, чтобы только вошедший в систему пользователь мог изменять свою фотографию ине фотографии других пользователей

View.py

class PhotoUpdate(UpdateView):
    model= Usuario  
    fields = ['foto']
    template_name='change-photo.html'

    def get_success_url(self):
            return reverse('sistema_index')

url.py

 url(r'^change-photo/(?P<pk>\d+)/$', views.PhotoUpdate.as_view(), 
     name='sistema_change_photo'),

change-photo.html

    {% if user.is_authenticated %}
    {{ user.usuario.pk }}
<form method="post" action="{% url 'sistema_change_photo' user.usuario.pk%}" class="form-signin" enctype="multipart/form-data">
{% csrf_token %}
<div class="form-row "> 
<div class="form-group col-md-12 ">

    {{ form.foto }}
</div>
</div>
<div class="form-row"> 
    <div class="form-group col-md-12">

</div>

<input type="submit" class="btn btn-primary" >

</form>

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Вы можете редактировать свои views.py , как показано ниже.

from django.http import Http404
from django.views.generic import UpdateView
from django.contrib.auth.mixins import LoginRequiredMixin    # Mixin that redirect user to login if not authenticated

class PhotoUpdate(LoginRequiredMixin, UpdateView):
    model= Usuario  
    fields = ['foto']
    template_name='change-photo.html'

    def get_object(self, queryset=None):
        if queryset is None:
            queryset = self.get_queryset()   # This should help to get current user 

        # Next, try looking up by primary key of Usario model.
        queryset = queryset.filter(pk=self.request.user)


        try:
            # Get the single item from the filtered queryset
            obj = queryset.get()
        except queryset.model.DoesNotExist:
            raise Http404("No user matching this query")
        return obj


    def get_success_url(self):
        return reverse('sistema_index')

Внутри вашего urls.py файла

url(r'^change-photo/$', views.PhotoUpdate.as_view(), 
     name='sistema_change_photo'),
0 голосов
/ 26 февраля 2019

Это зависит от того, какой код ошибки вы хотите получить при попытке получить доступ к фотографии других пользователей.

Если допустимо 404, то самый простой способ - ограничить QuerySet, с которым пользователю разрешено работать.Примерно так, но отредактируйте то, что вы назвали своим полем user-foreignkey

class PhotoUpdate(UpdateView):

     ...

     def get_queryset(self):
         return Usuario.objects.filter(user=self.request.user)

Если вы предпочитаете возвращать отказанное разрешение, вы хотите добавить класс разрешения в представление.

...