0

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

4

1 回答 1

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()给上下文中的模板并对其进行迭代。

无论如何,我希望这对你有用。

于 2013-10-31T21:43:14.520 回答