Comment puis-je accéder à un objet associé dans un modèle django? Je veux simplement afficher le titre de l'article du signet sur mon modèle. En supposant la vue et le (s) modèle (s) suivant (s):
def my_bookmarks(request):
if request.method == 'GET':
list_my_bookmarks = sorted(
chain(
UserBookmarks.objects.filter(user=request.user),
), key=attrgetter('date_added'), reverse=True
)
paginator = Paginator(list_my_bookmarks, 20) # Show 20 bookmarks per page
page = request.GET.get('page')
my_bookmarks = paginator.get_page(page)
user = request.user
args = {'user': user,
'my_bookmarks': my_bookmarks,
}
return render(request, 'App/my_bookmarks.html', args)
bookmarkable_post_models = models.Q(app_label='App', model='post') | models.Q(app_label='App', model='model-b') | models.Q(app_label='App', model='model-c')
class UserBookmarks(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user = models.ForeignKey(User, on_delete=models.CASCADE, null=False, blank=False)
content_type = models.ForeignKey(ContentType, limit_choices_to=bookmarkable_post_models, related_name='bookmarks', related_query_name='bookmark', on_delete=models.CASCADE, null=True, blank=False)
object_id = models.CharField(max_length=50, blank=False)
content_object = GenericForeignKey('content_type', 'object_id')
date_added = models.DateTimeField(auto_now_add=True, blank=False)
class Post(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(verbose_name="Post Title", max_length=20)
content = models.TextField(verbose_name="Content of Post")
...
bookmarks = GenericRelation(UserBookmarks, related_query_name='post')
L'accès aux objets du signet lui-même ne semble pas poser de problème si je le fais: {{my_bookmarks}} dans mon modèle mais je ne comprends pas comment accéder à l'élément de publication derrière le signet
Merci d'avoir lu
3 Réponses :
mybookmarks.post est un RelationManager ,mybookmarks.post.all() est un Queryset .Vous pouvez parcourir le modèle:
{% for post in mybookmarks.post.all %}
{{ post }}
{% endfor %}
```
Avez-vous essayé d'utiliser _set pour obtenir les objets Post associés?
par exemple:
{% for post in my_bookmarks.post_set.all() %}
{{ post.title }}
{% endfor %}
Cela affichera le titre de chaque Post lié à votre UserBookmark .
Ce qui suit a fonctionné pour moi:
{% for bookmark in my_bookmarks %}
<p>{{ bookmark.content_object.title }}</p>
Veuillez également consulter la section des commentaires de ma question.
Merci à tous
bookmark.post?Non, cela ne fonctionne pas.
bookmark.content_object?Encore une fois, rien qui n'a de sens car j'accède à UserBookmarks et non à publier. Je ne sais pas si "signet" a même un sens à ce stade car je veux obtenir l'objet Post derrière l'objet UserBookmarks ...
Ou est-ce que je dois peut-être faire l'inverse pour accéder à Post.bookmarks sur mon view.py?
content_objectdevrait fonctionner. Êtes-vous sûr que les colonnes clés génériques contiennent les données correctes?my_bookmarks.content_object.title fonctionne bien, merci pour vos conseils.