参照django模板中的用户id显示用户名

参照django模板中的用户id显示用户名,django,join,reversion,Django,Join,Reversion,我想这是一个简单的问题。由于某种原因,我还没有解决办法 我有一个来自django reversion:version\u list的对象集。集合中的每个对象都附加了一个用户id。如何获取与用户ID对应的用户名 为了更清楚,如果version_列表中的每个对象都有名称、日期和用户id,我如何将version_列表集与user表连接起来,以确定哪个用户id与哪个名称对应?这是在视图或模板中完成的?版本对象是否具有用户属性(即ForeignKey)或它只是一个整数字段?如果是用户外键,您应该能够说:

我想这是一个简单的问题。由于某种原因,我还没有解决办法

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


为了更清楚,如果version_列表中的每个对象都有名称、日期和用户id,我如何将version_列表集与user表连接起来,以确定哪个用户id与哪个名称对应?这是在视图或模板中完成的?

版本对象是否具有用户属性(即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 %}

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

user = models.ForeignKey(User)
如果该字段已被调用
user\u id
,则您甚至不必更改该表

至于获取用户名,这通常是在模板级别进行的,但这取决于您想要的是全名(Casey Stark)还是用户名(CaseyStark)

使用
{{user}}
显示用户名,使用
{{user.get_full_name}
显示全名。第二个方法调用模板中用户对象的get_full_name函数。请记住,必须设置user.first\u name和user.last\u name,才能使其不返回空字符串

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

我认为您正在寻找一个简单的模板标记

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 %}
我得到了一封推荐信

如果您的Entries模型中有一个指向
用户的
ForeignKey
就更好了

型号。py:

from django.contrib.auth.models import User
class CustomModelName(models.Model):
    user = models.ForeignKey(User) # instead of user_id = IntegerField()
def home(request):
    entries = CustomModelName.objects.all()
    context = {"entries": entries}
    return render(request, 'APPNAME/template.html', context)
{% for entry in entries %}
    {{ entry.user.username }}
{% endfor %}
视图。py:

from django.contrib.auth.models import User
class CustomModelName(models.Model):
    user = models.ForeignKey(User) # instead of user_id = IntegerField()
def home(request):
    entries = CustomModelName.objects.all()
    context = {"entries": entries}
    return render(request, 'APPNAME/template.html', context)
{% for entry in entries %}
    {{ entry.user.username }}
{% endfor %}
Template.html:

from django.contrib.auth.models import User
class CustomModelName(models.Model):
    user = models.ForeignKey(User) # instead of user_id = IntegerField()
def home(request):
    entries = CustomModelName.objects.all()
    context = {"entries": entries}
    return render(request, 'APPNAME/template.html', context)
{% for entry in entries %}
    {{ entry.user.username }}
{% endfor %}

我认为该对象没有用户属性。只是一个用于user_id的整数字段。我希望避免在版本模型中添加任何函数。我想应该有一种方法来进行查找,而不必像那样将其捆绑在一起。例如,当您使用django管理员时,您可以看到通过该界面进行编辑的用户和时间。reversion应用程序与admin挂钩,因此在该界面之外所做的编辑也会列出,包括时间和用户名。有没有一种方法可以像填充一个用户\u列表集,其中用户\u id等于版本\u列表集中的id?这可能会起作用。但是我不想改变模型的当前状态如果你真的不能改变模型,那么模板标签很可能就是模板标签。但我强烈建议现在就处理这个问题,因为所有其他Django代码都基于使用ForeignKey(用户)。例如,Django标志假定您要标记的任何对象中都有一个ForiegnKey(用户)。现在使用简易修复程序只会在以后造成更多的麻烦。