2010-04-02 32 views
2

我希望這是一個簡單的問題。出於某種原因,我還沒有解決方案。顯示用戶名參考Django模板中的用戶ID

我有一個從django reversion設置的對象:version_list。該集合中的每個對象都附有一個用戶標識。我如何獲取與用戶標識相對應的用戶名?

爲了更清楚一點,如果version_list中的每個對象都有一個名稱,日期和用戶標識,那麼如何加入與用戶表設置的version_list來確定哪個用戶標識使用哪個名稱?這是在視圖或模板中完成的?

回答

9

我想你正在尋找一個簡單的模板標籤。

from django import template 
from django.contrib.auth.models import User 

register = template.Library() 

@register.simple_tag 
def get_username_from_userid(user_id): 
    try: 
     return User.objects.get(id=user_id).username 
    except User.DoesNotExist: 
     return 'Unknown' 

,你會使用像:

{% for version in version_list %} 
    {% get_username_from_userid version.user_id %} 
{% endfor %} 
0

版本對象是否具有用戶屬性(即ForeignKey)還是隻是一個整數字段?如果它是一個用戶外鍵,你應該能夠說:

{% for v in version_list %} 
{{ v.user.get_full_name }} 
{% endfor %} 

否則你將需要一個函數/屬性添加到您的版本的對象中查找相關的用戶,像

from django.contrib.auth.models import User 

def related_user(self): 
    try: 
     return User.objects.get(pk=self.user_id) 
    except User.DoesNotExist: 
     return None 

,然後在模板:

{% for v in version_list %} 
{{ v.related_user.get_full_name }} 
{% endfor %} 
+0

我不相信的對象有一個用戶屬性。只是user_id的整數字段。我想避免在版本模型中添加任何功能。我認爲應該有一種方法來進行查找,而不用像這樣捆綁在一起。例如,當您使用django admin時,您可以看到通過該界面進行編輯的用戶和時間。反轉應用程序掛接到管理員,以便在該界面之外進行的編輯也列出 - 包括時間和用戶名。有沒有辦法做一些事情,比如填充一個user_list集合,其中user_ids等於來自version_list集合的id? – 2010-04-02 17:49:44

1

除非這是某種傳統的兼容性,你應該改變你的架構使用ForeignKey(User)。該數據應該是此列的相同,所以如果你已經有很多的東西,你不想在你的數據庫失去剛剛更新模型場

user = models.ForeignKey(User) 

,你甚至不會有如果該字段已被稱爲user_id,請更改表格。

至於獲取用戶名稱,這是總是在模板級完成,但它取決於您是要全名(凱西斯塔克)還是用戶名(caseywstark)。

使用{{ user }}顯示用戶名和{{ user.get_full_name }}以顯示全名。第二種方法調用模板中的User對象的get_full_name函數。請記住,您必須設置user.first_name和user.last_name才能使其不返回空字符串。

{% for version in version_list %} 
    {{ version.user }} wrote version {{ version }} 
{% endfor %} 
+0

這可以工作。但我不想從現在的狀態改變模型 – 2010-04-03 17:55:16

+0

如果你真的*不能改變模型,那麼模板標籤可能是模板標籤是要走的路。但是我強烈推薦現在處理這個,因爲所有其他的Django代碼都是基於使用ForeignKey(User)的。舉例來說,Django-flag假定你想要標記的任何對象都有一個ForiegnKey(用戶)。現在使用簡易修復會稍後會產生更多麻煩。 – 2010-04-03 20:11:23