Django: отображение различных данных из представления на основе URL с использованием if elif - PullRequest
0 голосов
/ 29 ноября 2018

У меня около 1000 записей данных, и я хотел бы отобразить подмножества этих данных в одном файле шаблона на основе категории.У меня проблемы с поиском решения, которое действительно работает.Ниже приводится то, что я имею, но я уверен, что есть гораздо более эффективный способ сделать это.

Просмотр

def man_org_list(request):
    manufacturers = Organization.objects.filter(member__member_flag=1, member__member_type='Manufacturer').order_by('id')
    suppliers = Organization.objects.filter(member__member_flag=1, member__member_type='Supplier').order_by('id')
    distributor = Organization.objects.filter(member__member_flag=1, member__member_type='distributor').order_by('id')
    return render(request, 'profiles/man_dash.html', {'man': manufacturers, 'sup': suppliers, 'dist': distributor})

urls.py

urlpatterns = [
    url(r'^$', views.org_list, name='org_list'),
    url(r'^(?P<id>\d+)/$', views.org_details, name='org_details'),
    url(r'^man_dash/', views.man_org_list, name='man_org_list')
]

Часть кода, который я пытаюсь изменить, на основе категории:

{% if request.get_full_path == '/profiles/man_dash/manufacturers/' %}
  {% for org in man %}
      <tr>
        <th scope="row">{{ org.id }}</th>
        <td>{{ org.org_name }}</td>
        <td>{{ org.org_type }}</td>
        {% for member in org.member.all %}
        <td>{{ member.member_flag }}</td>
        {% endfor %}
        {% for c_score in org.c_score.all %}
        <td>{{ c_score.completeness_score }}%</td>
        {% endfor %}
        <td><a href="{% url 'org_details' org.id %}" target="_blank">View</a></td>
      </tr>
  {% endfor %}
{% endif %}

Как вы можете видеть из фрагмента, яиспользуя request.get_full_path для сопоставления пути URL для отображения данных.Однако, используя этот подход, мне пришлось бы копировать один и тот же блок кода 3 раза, меняя только одну страницу, что заставляет меня поверить, что это не идеальный способ сделать это.

Есть ли лучший способ сделать это, возможно, через представление или url.py?

1 Ответ

0 голосов
/ 29 ноября 2018

Я не уверен, что это то, что вам нужно, но давайте попробуем.

Прежде всего кажется, что ваш URL не будет соответствовать должным образом:

Позволяет добавить member_type аргумент, который будетбыть захваченным из URL

urlpatterns = [
    url(r'^$', views.org_list, name='org_list'),
    url(r'^(?P\d+)/$', views.org_details, name='org_details'),
    url(r'^man_dash/<b><str:member_type></b>/', views.man_org_list, name='man_org_list')
]

Теперь добавьте kwarg в представление:

def man_org_list(request, <b>member_type=None</b>):
    member_type_map = {
        'manufacturers': 'Manufacturer',
        'suppliers': 'Supplier',
        'distributors': 'distributor'
    }

    member_type = member_type_map.get(member_type, None)
    if member_type is None:
        raise Http404
    queryset = Organization.objects.filter(member__member_flag=1, member__member_type=<b>member_type</b>).order_by('id')
    return render(request, 'profiles/man_dash.html', <b>{'object_list': queryset}</b>)

Теперь вашему шаблону нужно только перебрать список объектов

{% for org in <b>object_list</b> %}
      <tr>
        <th scope="row">{{ org.id }}</th>
        <td>{{ org.org_name }}</td>
        <td>{{ org.org_type }}</td>
        {% for member in org.member.all %}
        <td>{{ member.member_flag }}</td>
        {% endfor %}
        {% for c_score in org.c_score.all %}
        <td>{{ c_score.completeness_score }}%</td>
        {% endfor %}
        <td><a href="{% url 'org_details' org.id %}" target="_blank">View</a></td>
      </tr>
  {% endfor %}
...