Запретить пользователям видеть загруженные изображения других пользователей
У меня есть приложения 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})