Django как перечислить клиентов на боковой панели

#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

Для получения дополнительной информации о тегах шаблонов обратитесь к этому:

Вы также можете использовать тег включения вместо простого тега для большей гибкости и возможности повторного использования кода.