Tuesday, December 27, 2016

Re: How to display user's photo that i follow in post's list in Django

If I'm following correctly and you want to access author profile photos from querysets of Post objects: if you add related_name='profile' to the user field in the Profile model then you can add a method to the Post model:

def author_profile_photo(self):
   
return self.author.profile.photo

and then access the photos in the template using {{ post.author_profile_photo }}
You will need to catch cases where there is no photo either in the class method or the template to avoid an error, eg.
{% if post.author_profile_photo %} {{ post.author_profile_photo }} {% else %} {{ <placeholder image>}} {% endif %}



On Friday, December 23, 2016 at 1:45:56 AM UTC, skerdi wrote:
That get_photo func, I'm not using it. It tried to do something and I forgot to delete it.
About screenshotting the code, I thought that it was more clarifying.

class ProfileManager(models.Manager):
use_for_related_fields = True

def all(self):
qs = self.get_queryset().all()
try:
if self.instance:
qs = qs.exclude(user=self.instance)
except:
pass
return qs

def toggle_follow(self, user, to_toggle_user):
user_profile = user.profile
if to_toggle_user in user_profile.following.all():
user_profile.following.remove(to_toggle_user)
adedd = False
else:
user_profile.following.add(to_toggle_user)
adedd = True
return adedd

def is_following(self, user, followed_by_user):
user_profile = user.profile
if followed_by_user in user_profile.following.all():
return True
return False


class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
following = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='followed_by')
date_of_birth = models.DateField(blank=True, null=True)
city = models.CharField(max_length=50, blank=True, null=True)
country = models.CharField(max_length=50, blank=True, null=True)
education = models.CharField(max_length=150, blank=True, null=True)
photo = models.ImageField(upload_to='profile photos/', blank=True, null=True)

objects = ProfileManager()

def __str__(self):
return 'Profile for user {}'.format(self.user.username)

def get_following(self):
users = self.following.all()
return users.exclude(username=self.user.username)

@receiver(post_save, sender=User)
def create_or_update_user_profile(sender, instance, created, *args, **kwargs):
if created:
Profile.objects.create(user=instance)
            instance.profile.save() 

class Post(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL)
profile = models.ForeignKey(Profile)
title = models.CharField(max_length=200)
content = models.TextField()
image = models.FileField(upload_to='posts/', blank=True)
created = models.DateTimeField(auto_now_add=True, db_index=True)
modified = models.DateTimeField(auto_now=True)
slug = models.SlugField(unique=True)
likes = models.PositiveIntegerField(default=0)

@property
def total_likes(self):
return self.likes.count()

def __str__(self):
return self.title

class Meta:
ordering = ["-created"]

def get_absolute_url(self):
return reverse("detail", kwargs={"slug": self.slug})

def _get_unique_slug(self):
slug = slugify(self.title)
unique_slug = slug
num = 1
while Post.objects.filter(slug=unique_slug).exists():
unique_slug = '{}-{}'.format(slug, num)
num += 1
return unique_slug

def save(self, *args, **kwargs):
if not self.slug:
self.slug = self._get_unique_slug()
super(Post, self).save()

This is copy/pasting it :)
I still need to make that queryset to show a list of posts the users that I follow(and myself) with Profile combined or showing the post.content and profile.photo. 



On Thursday, December 22, 2016 at 2:26:36 PM UTC+1, Melvyn Sopacua wrote:
Hi,

not sure why you're screenshotting code instead of copying it...makes it
harder to point you at the mistake.

On Wednesday 21 December 2016 14:33:58 skerdi wrote:
> *In a  post list I've shown only the users posts that I follow but I'm
> not able to display their photo. *

in Profile.get_photo() you set users to self.photo. I don't think you
wanted to do that.

--
Melvyn Sopacua

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/7c287749-f696-4869-83ce-f74b1e51cb3f%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment