【问题标题】:Django: Display different data from a view based on URL using if elifDjango:使用 if elif 根据 URL 显示来自视图的不同数据
【发布时间】:2018-11-29 17:10:14
【问题描述】:

我有大约 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 %}

正如您在 sn-p 中看到的,我使用 request.get_full_path 来匹配 url 路径以显示数据。但是,使用这种方法,我将不得不复制相同的代码块 3 次,只更改一页,这让我相信这不是执行此操作的理想方法。

有没有更好的方法可以通过视图或 url.py 做到这一点?

【问题讨论】:

    标签: python django python-3.x django-templates django-views


    【解决方案1】:

    我不确定这是否是您需要的,但让我们试试吧。

    首先,您的网址似乎无法正确匹配:

    让我们添加将从 url 捕获的 member_type 参数

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

    现在将 kwarg 添加到视图中:

    def man_org_list(request, member_type=None):
        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=member_type).order_by('id')
        return render(request, 'profiles/man_dash.html', {'object_list': queryset})

    现在您的模板只需要遍历对象列表

    {% for org in object_list %}
          <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 %}

    【讨论】:

    • 感谢您的快速回复。我看到你是怎么做的,这很有意义。但是,我得到“当前路径,profiles/man_dash/suppliers/,与其中任何一个都不匹配。”
    • 我还注意到在行 member_type = member_type.map.get(member_type, None), member_type.map 应该是 member_type_map 但这仍然没有解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 2021-12-08
    • 1970-01-01
    • 2014-12-18
    • 2020-07-13
    相关资源
    最近更新 更多