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)#听起来您只需要一个配置文件视图,其中还包含用户发布的帖子列表?是的,这是正确的。您可以添加