Запретить пользователям видеть загруженные изображения других пользователей

У меня есть приложения Django, которые используют несколько пользователей. Пользователи могут загружать изображения в систему. Я создал модель изображения с внешним ключом пользователя, чтобы узнать, какой пользователь загрузил какое изображение.

class Picture(models.Model):
    picture = models.ImageField(upload_to='pictures')
    uploader = models.ForeignKey(User)
    #other specific fields like date etc

Я настроил файл настроек для использования MEDIA_URL и MEDIA_ROOT

settings.py

MEDIA_URL ='/media/'
MEDIA_ROOT = 'path/to/media/'

Так что я могу получить доступ к картинке в www.mydomain.com/media/pictures/picture.jpg, Но я предполагаю, что наличие общего MEDIA_ROOT означает, что любой пользователь может видеть эту картинку правильно, а не только тот, кто ее загрузил. В моих веб-страницах я использую

<img src={{image.picture}}>

показывать изображения пользователя. Как я могу запретить пользователю видеть изображение, загруженное другим пользователем (запрещенное сообщение)? Можно ли это сделать при настройке?

2 ответа

Ваша функция просмотра, вероятно, выглядит примерно так:

@login_required
def theview(request):
    ...
    image = Picture.objects.get(*args)
    ...
    return render(request, 'template', {'image': image})

Дело в том, что вы можете легко передать изображение, только если оно было загружено вошедшим в систему пользователем. Например

image = get_object_or_404(Picture, uploader=request.user, other_filters)

Или даже

image = Picture.objects.get(*args)
image = image if image.uploader == request.user else None

Тогда в шаблоне Django

{% if image %}
<img ....>
{% endif %}

Вы можете попробовать вот так:

в представлениях:

def allpicture(request):
       .....
       #for all pictures
       images= Picture.objects.filter(uploader=request.User)
       return render(request, '/sometemplate', {'images': images})


def onepicture(request, pic_id):
      ....
      #for one picture
      image= Picture.objects.filter(id= pic_id, uploader=request.User) #url for this view should be like url(r'^pictures/(?P<pic_id>\d+)/$'
      render render(request, '/sometemplate', {'image': image})
Другие вопросы по тегам