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_object
devrait 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.