В Django, если мой запрос возвращает имя пользователя, могу ли я также получить его имя и фамилию?
Я создаю Django-приложение для юридической фирмы, позволяющее назначать входящие дела юристам фирмы. Юристы являются пользователями, поэтому я использовал список юристов для создания выпадающего списка их имен пользователей, чтобы было легко выбрать активного юриста для назначения.
В некоторых шаблонах, которые я создаю, несложно показать полное имя назначенного адвоката. Я использую "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 admin по умолчанию, мои выпадающие списки могут показывать только имя пользователя ("johnattorney" вместо "John Attorney"). Также на страницах адвоката (страницы, которые показывают индивидуальных назначенных клиентов адвоката) я могу показать только имя пользователя.
Код для создания этого кода таков
<h1>Clients assigned to {% if request.GET.username %}{{ request.GET.username }}{% endif %}</h1>
Здесь я хотел бы получить доступ к этому запросу "attorneys", но, похоже, у меня есть только request
, который просто возвращает имя пользователя.
Мой вопрос заключается в следующем: В контексте Admin или в контексте страницы, основанной на модели Client, которая знает только имя пользователя как значение "assignee" как часть модели, могу ли я заставить отображаться имя и фамилию вместо имени пользователя?
Да, сначала вам придется определить метод в модели, который вы хотите получить полное имя.
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
Вы можете просто вызвать оба имени с атрибутом method в вашем Hmtl следующим образом
<ul class="dropdown">
{% if attorneys %}
{% for attorney in attorneys %}
<li><a href="/by_attorney?username={{ attorney.username.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, без пользовательских представлений, и я думаю, что это будет более сложное изменение.