2013-10-31 92 views
0

在我的應用程序中,用戶可以鏈接配置文件。在站點所有頁面上可見的側欄中,我想顯示用戶鏈接到的配置文件的用戶名。到目前爲止,我已經創建了一個m2m字段來鏈接配置文件,並且當用戶登錄時,我將這些信息存儲在會話中,以便它可以與其他會話信息捆綁在一起,並且不會創建另一個必須顯式傳遞給每個模板。但是,在訪問鏈接配置文件列表時,我只能訪問配置文件的ID,而不能訪問其他任何信息。django如何訪問模板中的m2m關係

模型

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

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()返回的查詢集合傳遞給上下文中的模板,然後重複此操作。

無論如何,我希望這對你有用。