我希望将来自不同应用程序的两个模型渲染到一个模板中。例如,在我的主页中,有列出帖子的列表,这些列表显示了帖子作者和相应的帖子内容。当我单击作者标签时,我想在顶部显示作者个人资料,并在该作者的下面列出帖子。我正在使用基于类的视图(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'),
所以,我的问题是如何进行查询以获取来自选定/单击的用户的帖子。用户个人资料部分工作正常。但是无法从帖子模型中获取数据。
答案 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 notes)django.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