Как получить доступ к фотографии профиля автора поста в Django?
Я пытаюсь отобразить изображение профиля пользователя в блоге/приложении для социальных сетей, когда пользователь нажимает на имя пользователя другого пользователя, но в настоящее время это не работает.
В моем шаблоне: (я думаю, что моя проблема в том, что у меня нет доступа к посту?)
<img class="rounded-circle article-img" src="{{ post.author.profile.image.url }}">
Мои пользователи\models.py:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
image = models.ImageField(default='default.jpg', upload_to='profile_pics')
def __str__(self):
return f'{self.user.username} Profile'
def save(self, *args, **kwargs):
super(Profile, self).save(*args, **kwargs)
img = Image.open(self.image.path)
if img.height > 300 or img.width > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.image.path)
В моем блоге/models.py:
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.pk})
Я могу получить имя пользователя некоторого пользователя по {{ view.kwargs.username }}
, как я могу сделать это с фотографиями профиля?
мой блог\views.py:
def home(request):
context = {
'posts': Post.objects.all(), # querying the database
}
return render(request, 'blog/home.html', context)
class PostDetailView(DetailView):
model = Post
class UserPostListView(ListView):
model = Post
template_name = 'blog/user_posts.html' # <app>/<model>_<viewtype>.html
context_object_name = 'posts'
paginate_by = 5
def get_queryset(self):
user = get_object_or_404(User, username=self.kwargs.get('username'))
return Post.objects.filter(author=user).order_by('-date_posted')
Используйте ForeignKey
вместо OneToOneField
. Добавьте related_name
:
class Profile(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="profile")
image = models.ImageField(default='default.jpg', upload_to='profile_pics')
в html:
<img class="rounded-circle article-img" src="{{ post.author.profile.image.url }}">
Вы также можете написать собственный метод.
e.g:
class Post(models.Model):
...
author = models.ForeignKey(User, on_delete=models.CASCADE)
...
def get_owner_pp(self):
return self.author.profile.image.url
в html:
<img class="rounded-circle article-img" src="{{ post.get_owner_pp }}">