Python 如何在Django中将基于函数的视图集成到基于类的视图中?

Python 如何在Django中将基于函数的视图集成到基于类的视图中?,python,html,css,django,django-views,Python,Html,Css,Django,Django Views,在我的站点中,我有两个用户部分。用户发布页面和配置文件页面。个人资料页面上有他们的所有信息,所以用户名、描述、名字/姓氏等,而用户帖子页面上有他们的所有帖子。然而,我想以某种方式将它们整合在一起 下面是一些代码 这是用户帖子的视图 class UserPostListView(ListView): 型号=员额 模板名称='mainapp/user\u posts.html' 上下文\对象\名称='posts' def get_queryset(自我): user=get\u object\u或_

在我的站点中,我有两个用户部分。用户发布页面和配置文件页面。个人资料页面上有他们的所有信息,所以用户名、描述、名字/姓氏等,而用户帖子页面上有他们的所有帖子。然而,我想以某种方式将它们整合在一起

下面是一些代码

这是用户帖子的视图

class UserPostListView(ListView):
型号=员额
模板名称='mainapp/user\u posts.html'
上下文\对象\名称='posts'
def get_queryset(自我):
user=get\u object\u或_404(user,username=self.kwargs.get('username'))
return Post.objects.filter(author=user).order_by('-published_date'))
如您所见,我正在返回特定用户的帖子

现在这是我的剖面图

def view_配置文件(请求,主键=无):
如果主键:
user\u profile=user.objects.get(pk=pk)
其他:
user\u profile=request.user
上下文={'user':用户配置文件}
返回呈现(请求,'mainapp/profile.html',上下文)
它返回用户的所有信息

下面是配置文件和用户帖子页面的HTML代码

{%block content%}
{{user | safe | linebreaksbr | truncatechars_html:25}{%if user.userprofileinfo.verified%}{%endif%}
{{user.first_name}{{user.last_name}}


{{user.userprofileinfo.description}

{{user.userprofileinfo.joined|date:“fdy”}


{%if user.userprofileinfo.image%} {%endif%} 帖子 {posts%%中的post为%s} {{post.title}} {%if post.published_date%} 由{{post.author}}{{post.published{u date | timesince}}前发布

{%else%} {%endif%}

{{post.text | safe | linebreaksbr}

{%endfor%} {%endblock%}
这是用户发布页面

{%block content%}

{{view.kwargs.username}

{{user.userprofileinfo.email}

洛勒姆

{posts%%中的post为%s} {{post.title}} {%if post.published_date%} 由{{post.author}}{{post.published{u date | timesince}}前发布

{%else%} {%endif%}

{{post.text | safe | linebreaksbr}

{%endfor%} {%endblock%}
我尝试将FBV合并到CBV中,方法是将其剪切并粘贴到get_queryset方法下面,如下所示

def get_queryset(self):
#... 代码在这里
def视图_配置文件(请求,主键=无):
#... 代码在这里
然而,这并没有起作用。我只是好奇如何将两者结合在一起,这样我就可以在一个地方拥有两个世界中最好的

编辑:这是模型


类UserProfileInfo(models.Model):
user=models.OneToOneField(用户,on_delete=models.CASCADE,最大长度=30)
first_name=models.CharField(最大长度=50)
last_name=models.CharField(最大长度=50)
description=models.CharField(最大长度=150)
网站=models.URLField(最大长度=200)
image=ProcessedImageField(上传到='profile\u pics',
处理器=[ResizeToFill(150150)],
default='default.jpg',
format='JPEG',
选项={'quality':60})
joined_date=models.DateTimeField(blank=True,null=True,default=timezone.now)
已验证=模型。布尔字段(默认值=False)
定义(自我):
返回f'{self.user.username}配置文件'
def保存(自身、*args、**kwargs):
super().save(*args,**kwargs)
现在是邮报

class Post(models.Model):
author=models.ForeignKey(用户,相关的\u name='posts',在\u delete=models.CASCADE上)
title=models.CharField(最大长度=75)
text=models.TextField()
group=models.ForeignKey(group,null=True,blank=True,related\u name='posts',on\u delete=models.CASCADE)
创建日期=models.DateTimeField(默认值=时区.now)
image=models.ImageField(上传到class='post\u images',blank=True,null=True)
file=models.FileField(上传到class='post\u files',blank=True,null=True)
发布日期=模型.日期时间字段(空白=真,空=真,自动\u现在\u添加=真)
comments_disabled=models.BooleanField(默认值=False)
NSFW=models.BooleanField(默认值=False)
扰流板=型号。布尔字段(默认值=False)
tags=TaggableManager()
定义(自我):
返回自己的标题
def保存(自身、*args、**kwargs):
super().save(*args,**kwargs)

获取用户的简单基于类的视图:

class UserDetailView(DetailView):
    model = User
    template_name = 'mainapp/profile.html'
    context_object_name = 'user'
关系(外键)可以向后跟踪。每个外键都定义了一个反向关系(除非将
reverse\u name
设置为
+
..),它通常在外键引用的模型上命名为
\u set

例如,以下两行是等效的

Post.objects.filter(author=user)
user.post_set.all()
这可以在您的配置文件模板中使用

{% for post in user.post_set.all %}
    ...
{% endfor %}

同样在Ian answer的后续部分中,如果您在模型之间有直接关系,那么您可以简单地获得特定用户的帖子,如下所示:

def view_profile(request,pk=None):
        if pk:
            user_profile = User.objects.get(pk=pk)
            user_posts = Posts.objects.filter(user__id=pk)   #<---add these
        else:
            user_profile = request.user
            user_posts = Posts.objects.filter(user__id = request.user.id)   #<---add these
        context = {
                   'user':user_profile,
                   'user_posts':user_posts
                  }
        return render(request,'mainapp/profile.html',context)
def view_配置文件(请求,主键=无):
如果主键:
user\u profile=user.objects.get(pk=pk)

user_posts=posts.objects.filter(user_uid=pk)#听起来您只需要一个配置文件视图,其中还包含用户发布的帖子列表?是的,这是正确的。您可以添加