如何在一个模板中使用来自不同应用程序的两种模型

时间:2019-08-28 17:07:30

标签: python django django-models django-templates

我希望将来自不同应用程序的两个模型渲染到一个模板中。例如,在我的主页中,有列出帖子的列表,这些列表显示了帖子作者和相应的帖子内容。当我单击作者标签时,我想在顶部显示作者个人资料,并在该作者的下面列出帖子。我正在使用基于类的视图(ListView和d DetailView)。 在“用户应用”中,我具有个人资料模型,在“博客应用”中,我具有邮政模型。

blog/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})

users/models.py
    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        image = models.ImageField(default='default.jpg', upload_to='profile_pics')
        phone = models.CharField(max_length=10, blank=True)

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

users/views.py
    class ProfileDetailView(DetailView):
        model = Profile

        # to get two model in one page
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['posts'] = Post.objects.all()
            return context
my template
    <div class="">
    <legend class="border-bottom mb-4">Profile Info</legend>
    <div class="media">
      <img class="rounded-circle account-img" src="{{ object.image.url }}">
      <div class="media-body">
        <h2 class="account-heading">{{object.user.username}}</h2>
        <p class="text-secondary">{{object.user.email}}</p>
        <p class="text-secondary">{{object.user.profile.phone}}</p>
      </div>
    </div>
</div>
<div class="">
    <legend class="border-bottom mb-4">User's Posts</legend>
        <h2 class="account-heading">{{?????}}</h2>
        <p class="text-secondary">{{??????}}</p>
</div>


urls.py
        path('profile/<int:pk>/', views.ProfileDetailView.as_view(), 
              name='profile-detail'),

所以,我的问题是如何进行查询以获取来自选定/单击的用户的帖子。用户个人资料部分工作正常。但是无法从帖子模型中获取数据。

4 个答案:

答案 0 :(得分:0)

您需要扩展User模型并添加get_absolute_url()方法,该方法将在渲染帖子时返回您的作者外键的相对或绝对路径。

请参阅django官方文档:https://docs.djangoproject.com/en/2.2/ref/models/instances/#django.db.models.Model.get_absolute_url

{% for each in posts %}
<li>{{each.title}} | Written by <a href="{{each.author.get_absolute_url}}">{{each.author}}</a></li>
{% endfor %}

答案 1 :(得分:0)

自v1.7(see release notesdjango.contrib.auth.models.AbstractUser起,不再定义get_absolute_url()方法。

因此,您需要为用户模型创建get_absolute_url方法,以便可以在模板中使用{{ user.get_aboslute_url}}

可以通过dotslash227 suggest in his answer作为自定义用户模型来完成此操作,也可以通过将ABSOLUTE_URL_OVERRIDES添加到您的设置来完成,有点简单。

随后,您可以在模板中{{ user.get_aboslute_url }}(更像是{{each.author.get_absolute_url}})。

对于后一种情况,设置部分可能类似于:

ABSOLUTE_URL_OVERRIDES = {
    'auth.user': lambda u: "/users/%s/" % u.username,
}

显然,无论如何,您仍然需要为此模式定义一个视图。

答案 2 :(得分:0)

您可以使用DetailView来访问self.request.user类中的当前用户

因此可以获取特定用户的帖子,这就是您可能需要的-

context['posts'] = Posts.objects.filter(author=self.request.user),因为作者是指向用户模型的外键。

代替

context['posts'] = Post.objects.all()

这应该给您当前用户的帖子。让我知道您是否需要任何澄清。

答案 3 :(得分:0)

最后我得到了答案。感谢所有试图帮助我的人。 问题出在查询中。 rohit keshav的评论暗示了我的问题。以下是代码:

users/views.py
    class ProfileDetailView(DetailView):
        model = Profile

        # to get two model in one page
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['posts']=Post.objects.filter(author=self.object.user)
            return context