#python #django
#python #django
Вопрос:
Я создал систему с помощью Django. У пользователя есть несколько клиентов. Боковая панель находится в base.html
файле. Я создал представление для боковой панели, но оно работает только внутри homepage
. Когда я открываю другую страницу, она исчезает. Как я могу это исправить?
views.py
def base(request):
current_user = request.user
userP = UserProfile.objects.get_or_create(username=current_user)
customer_list = Customer.objects.filter(companyName=userP[0].comp_name)
return render(request, 'base.html', {'customer_list': customer_list})
base.html
<ul>
<li class="header-menu">
<span>Customers</span>
</li>
<li class="sidebar-dropdown">
{% for customer in customer_list %}
<a href="#">
<i class="fa fa-building"></i>
<span>{{customer.name}}</span>
</a>
<div class="sidebar-submenu">
<ul>
<li>
<a href="/customers/{{ customer.id }}/update"> Update</a>
</li>
<li>
<a href="#">Analyses</a>
</li>
</ul>
</div>
{% endfor %}
</li>
</ul>
Комментарии:
1. Вы должны привести пример этой «неработающей другой страницы», потому что это в основном суть вашей проблемы
Ответ №1:
Ну, {{ user }}
это текущий пользователь в шаблоне. Вы можете использовать обратные отношения, чтобы получить компании, подобные этой:
{% for customer in user.userprofile.customer_set.all %}
{{customer.name}}
{% enfor %}
Объяснение: Предположим, что пользователь имеет отношение к UserProfile
OneToOne , тогда вы должны получить информацию о профиле пользователя user.userprofile
. Теперь Customer
у него есть ForeignKey UserProfile
. Итак, вы можете получить все Customer
s путем запроса (или обратного запроса) user.userprofile.customer_set.all()
. Если вы определили related_name
в ForeignKey, то запрос должен быть user.userprofile.<related_name>.all()
Ответ №2:
Вы можете использовать теги шаблонов. В Django есть теги шаблонов для выполнения сложных операций в шаблонах.
Что вы можете сделать, так это создать пользовательский тег шаблона, который будет принимать пользователя в качестве входных данных и возвращать набор запросов клиентов, который вы можете сохранить в переменной, а затем перебирать его, чтобы отобразить всех клиентов.
В myprojectdir/app_name/templatetags/customer_list.py
from django import template
from myapp.models import Customer
register = template.Library()
@register.simple_tag
def get_customers(user):
userP = UserProfile.objects.get_or_create(username=user)
customer_list = Customer.objects.filter(companyName=userP[0].comp_name)
return customer_list
Затем внутри вашего шаблона вы можете сделать это
{% load customer_list %}
{% get_customers request.user as customers %}
{% for customer in customers %}
<Your html code>
{% endfor %}
Поскольку Django автоматически передает request
контекст для всех шаблонов, вы должны получить доступ к текущему пользователю с помощью request.user
.
Чтобы понять, где создать файл тегов шаблона, обратитесь к этому https://docs.djangoproject.com/en/3.1/howto/custom-template-tags/#code-layout
Для получения дополнительной информации о тегах шаблонов обратитесь к этому:
Вы также можете использовать тег включения вместо простого тега для большей гибкости и возможности повторного использования кода.