在Django中,如果我请求returns一个用户名,我是否也可以得到用户的名字和姓氏?

In Django, if my request returns a username, can I also get the user's first and last name?

我正在为一家律师事务所构建一个 Django 应用程序,让他们可以将收到的案件分配给该公司的律师。律师是用户,所以我使用了律师列表来下拉他们的用户名,因此很容易 select 活跃的律师进行分配。

在我创建的一些模板中,显示指定律师的全名并不难。我使用“client.assignee.get_full_name”,它显示“John Attorney”。

但那是一段似乎与客户端模型一起运行的数据。

我还可以通过上下文处理器查询律师列表,在菜单下拉列表中获取名字和姓氏:

def attorney_menu(request):
    return {
    'attorneys': User.objects.filter(groups__name='attorney-staff')
    }

生成的代码是:

 <ul class="dropdown">
      {% if attorneys %}
          {% for attorney in attorneys %}
              <li><a href="/by_attorney?username={{ attorney.username }}">{{ attorney.first_name }} {{ attorney.last_name }}</a></li>
          {% endfor %}
       {% endif %}
 </ul>

以上所有工作正常。

但是,在管理员中,在默认 Django 管理员创建的模板中,我的下拉列表只能显示用户名(“johnattorney”而不是“John Attorney”)。同样在律师页面(显示律师个人指定客户的页面),我只能显示用户名。

生成的代码是

    <h1>Clients assigned to {% if request.GET.username %}{{ request.GET.username }}{% endif %}</h1>

在这里,我想访问“律师”查询,但我似乎只有 request,这只是 returns 一个用户名。

那么我的问题是:在 Admin 上下文中,或者在基于客户端模型的页面上下文中,该模型只知道用户名作为模型的一部分的“受让人”的值,我可以显示名字和姓氏而不是用户名吗?

是的,首先你必须在模型下定义一个方法来获取全名。

class somemodel(models.Model):
     username = models.CharField(max_length=100)
     first_name = models.CharField(max_length=100)
     last_name = models.CharField(max_length=100)
     

     # then you get the names through the method 
     def get_full_name(self):
        full_name = "%s %s" % (self.first_name, self.last_name)
        return full_name

您可以像这样在 Hmtl 中使用方法属性简单地调用这两个名称

 <ul class="dropdown">
      {% if attorneys %}
          {% for attorney in attorneys %}
              <li><a href="/by_attorney?username={{ attorney.username.get_full_name }}"></a></li>
          {% endfor %}
       {% endif %}
 </ul>

我能够重用上下文处理器将全名添加到 By Attorney 页面标题中,如下所示:

<h1>Clients assigned to 
    {% if attorneys %}
    {% for attorney in attorneys %}
        {% if attorney.username == request.GET.username %}
      {{ attorney.first_name }} {{ attorney.last_name }}
        {% endif %}
    {% endfor %}
  {% endif %}
  </h1>

顺便说一句,上下文处理器只是:

def attorney_menu(request):
    return {
    'attorneys': User.objects.filter(groups__name='attorney-staff')
    }

至于更改管理中的下拉菜单,我想这是一个完全不同的问题。我正在使用标准的 Django 管理,没有自定义视图,我认为这将是一个更难做出的改变。