在django模板中参考用户ID显示用户名

时间:2010-04-02 16:30:30

标签: django join reversion

我希望这是一个简单的问题。出于某种原因,我还没有解决方案。

我有一个来自django reversion的对象集:version_list。集合中的每个对象都附加了一个用户ID。如何获取与用户ID对应的用户名?

为了更清楚,如果version_list中的每个对象都有名称,日期和用户ID,我如何加入带有用户表的version_list集来确定哪个用户ID与哪个名称相关?这是在视图或模板中完成的吗?

4 个答案:

答案 0 :(得分: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 %}

答案 1 :(得分:1)

除非这是针对某种遗留兼容性的,否则您应该真正更改架构以使用ForeignKey(User)。此列的数据应该相同,因此如果您已经有很多东西,您不想丢失在数据库中,只需将模型字段更新为

user = models.ForeignKey(User)

如果该字段已被调用user_id,您甚至不必更改表格。

至于获取用户名,在模板级别总是,但这取决于您是想要全名(Casey Stark)还是用户名(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 %}

答案 2 :(得分: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 %}

答案 3 :(得分:0)

我得到了 Blog 的参考。

最好在条目模型中有 ForeignKeyUser

Models.py:

from django.contrib.auth.models import User
class CustomModelName(models.Model):
    user = models.ForeignKey(User) # instead of user_id = IntegerField()

Views.py:

def home(request):
    entries = CustomModelName.objects.all()
    context = {"entries": entries}
    return render(request, 'APPNAME/template.html', context)

Template.html:

{% for entry in entries %}
    {{ entry.user.username }}
{% endfor %}