在我的应用中,用户可以关联个人资料。在网站的所有页面上都可见的侧边栏中,我想显示用户链接到的配置文件的用户名。到目前为止,我创建了一个m2m字段来链接配置文件,当用户登录时,我将此信息存储在会话中,以便它可以与其他会话信息捆绑在一起,并且不会创建必须显式传递给其他变量的另一个变量。每个模板。但是,在访问链接配置文件列表时,我只能访问配置文件的ID,而不能访问有关它们的任何其他信息。
模型
class Profile(models.Model):
username = models.CharField(max_length=25)
link = models.ManyToManyField('self', null=True, blank=True, related_name='link_profiles')
视图
def link_profiles(request, pid):
#get both profiles
my_p = Profile.objects.get(id=request.session['profile']['id'])
their_p = Profile.objects.get(id=pid)
#add profiles to eachothers links
my_p.link.add(their_p)
their_p.link.add(my_p)
#save profiles
my_p.save()
their_p.save()
#reset my session var to include the new link
#this is that same bit of code that sets the session var when the user logs in
request.session['profile'] = model_to_dict(my_p)
return redirect('/profiles/' + pid)
模板(使用pyjade)
- for profile in session.profile.link
div
a(href="/profiles/{{ profile }}") profile {{ profile }}
这会输出类似<a href='/profiles/5'>profile 5</a>
的内容,但使用profile.id
和profile.username
只会在<a href='/profiles/'>profile</a>
中添加空格。是否可以通过这种方式访问此信息而无需创建另一个会话变量(例如request.session['links']
)?
答案 0 :(得分:1)
model_to_dict
只会为您提供私钥(ID)列表,而不是相关对象的所有数据。
这意味着您需要通过迭代每个相关对象来创建'链接'会话变量:
request.session['links'] = [model_to_dict(link) for link in my_p.links.all()]
如果要优化它,可以使用集合,只添加新的配置文件:
data = model_to_dict(their_p)
if 'links' in request.session:
request.session['links'].add(data)
else:
request.session['links'] = set([data])
应该这样做,但我认为这可能不是最好的方法。我对PyJade并不熟悉,但是我会将my_p.links.all()
返回的查询集传递给上下文中的模板,然后迭代它。
无论如何,我希望这适合你。