【问题标题】:Display user name in reference to user id in django template在 django 模板中参考用户 ID 显示用户名
【发布时间】:2011-02-03 19:09:53
【问题描述】:

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

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

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

【问题讨论】:

    标签: django join reversion


    【解决方案1】:

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

    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 %}
    

    【讨论】:

      【解决方案2】:

      除非这是为了某种遗留兼容性,否则您应该真正更改架构以使用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 %}
      

      【讨论】:

      • 这可行。但我不想改变模型的当前状态
      • 如果你真的不能改变模型,那么模板标签可能就是模板标签是要走的路。但我强烈建议现在处理这个问题,因为所有其他 Django 代码都基于使用 ForeignKey(User)。例如,Django-flag 假定您在要标记的任何对象中都有一个 ForiegnKey(User)。现在使用简单的修复方法只会在以后造成更多麻烦。
      【解决方案3】:

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

      【讨论】:

      • 我不相信该对象具有用户属性。只是 user_id 的整数字段。我想避免向版本模型添加任何功能。我认为应该有一种方法可以进行查找,而无需像那样将其捆绑在一起。例如,当您使用 django 管理员时,您可以通过该界面查看编辑的用户和时间。还原应用程序与管理员挂钩,因此在该界面之外进行的编辑也会被列出 - 包括时间和用户名。有没有办法做一些事情,比如填充一个 user_list 集,其中 user_ids 等于 version_list 集中的 id?
      【解决方案4】:

      我收到了Blog 的引用。

      如果您的 Entries 模型中有 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)
      

      模板.html:

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

      【讨论】:

        猜你喜欢
        • 2021-07-05
        • 1970-01-01
        • 2021-03-01
        • 2020-07-05
        • 1970-01-01
        • 2021-08-16
        • 1970-01-01
        • 1970-01-01
        • 2012-08-14
        相关资源
        最近更新 更多