Django - доступ к связанным объектам в шаблоне - PullRequest
0 голосов
/ 05 апреля 2020

Как получить доступ к связанному объекту в шаблоне django? Я просто хочу отобразить заголовок сообщения закладки в моем шаблоне. Предполагая следующее представление и модели:

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')

Доступ к объектам закладок сам по себе не кажется проблемой, если я сделаю: {{my_bookmarks}} в моем шаблоне, но я не понимаю, как получить к нему доступ элемент сообщения за закладкой

Спасибо за чтение

Ответы [ 3 ]

0 голосов
/ 05 апреля 2020

Вы пытались использовать _set для получения связанных Post объектов?

, например:

{% for post in my_bookmarks.post_set.all() %}
   {{ post.title }}
{% endfor %}

Это напечатает заголовок каждого Post, относящегося к вашему UserBookmark.

0 голосов
/ 06 апреля 2020

Для меня сработало следующее:

 {% for my_bookmarks in my_bookmarks %}
    <p>{{ my_bookmarks.content_object.title }}</p>

Пожалуйста, также посмотрите раздел комментариев моего вопроса.

Спасибо всем

0 голосов
/ 05 апреля 2020
  • mybookmarks.post является RelationManager,
  • mybookmarks.post.all() является Queryset.

Вы можете выполнить итерации в шаблоне:

{% for post in mybookmarks.post.all %}
    {{ post }}
{% endfor %}
```
...