我希望这是一个简单的问题。出于某种原因,我还没有解决方案。
我有一个来自 django reversion 的对象集:version_list。集合中的每个对象都有一个附加的用户 ID。如何获取与用户 ID 对应的用户名?
为了更清楚一点,如果 version_list 中的每个对象都有名称、日期和用户 ID,我如何将 version_list 集与用户表连接起来,以确定哪个用户 ID 与哪个名称对应?这是在视图中完成的,还是在模板中完成的?
我认为您正在寻找一个简单的模板标签。
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 %}
除非这是为了某种遗留兼容性,否则您应该真正将架构更改为使用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 %}
版本对象是否具有用户属性(即 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 %}
我得到了Blog的参考。
如果您的 Entries 模型中有一个ForeignKey
to会更好。User
模型.py:
from django.contrib.auth.models import User
class CustomModelName(models.Model):
user = models.ForeignKey(User) # instead of user_id = IntegerField()
视图.py:
def home(request):
entries = CustomModelName.objects.all()
context = {"entries": entries}
return render(request, 'APPNAME/template.html', context)
模板.html:
{% for entry in entries %}
{{ entry.user.username }}
{% endfor %}