django如何在模板中访问m2m关系

时间:2013-10-31 19:27:52

标签: django

在我的应用中,用户可以关联个人资料。在网站的所有页面上都可见的侧边栏中,我想显示用户链接到的配置文件的用户名。到目前为止,我创建了一个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.idprofile.username只会在<a href='/profiles/'>profile</a>中添加空格。是否可以通过这种方式访问​​此信息而无需创建另一个会话变量(例如request.session['links'])?

1 个答案:

答案 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()返回的查询集传递给上下文中的模板,然后迭代它。

无论如何,我希望这适合你。