首页 > 解决方案 > Django试图为几个不同的列表视图重用相同的网页

问题描述

只是盯着 python /django。但试图变得比我的能力更聪明。因此,如果有人有时间教育我,我将不胜感激。我有一个主要模型来处理“工单”。然后我有链接到每个订单的数据子集。然后我生成了一个 html 模板,我可以在列表视图中查看订单和所有数据子集。

现在,我尝试为所有类型(模型)数据的列表视图生成一个通用 HTML 模板,而不是为每个数据模型创建一个 HTML 模板。我以为我可以通过 context_data 定义变量。

即使不完整,我想你也明白我想用下面的代码做什么。

否则 HTML 模板和视图正在工作。

视图.py

class WO_TravelView(ListView):
    template_name = 'TravelLaborPartsLists.html'
    model = WorkOrderTravel

    def get_context_data(self, **kwargs):
        id_ = self.kwargs.get('str')
        context = super().get_context_data(**kwargs)
        context['list'] = WorkOrderTravel.objects.filter(wo_num=id_).order_by('wo_travel_slug')
        context['page'] = 'Travel logged for'
        context['string'] = id_
        context['label'] = 'Work order-instance / Start / Stop '
        context['data1'] = 'item.wo_travel_slug'
        context['data2'] = 'item.wo_travel_start'
        context['data3'] = 'item.wo_travel_stop'
        return context


class WO_PartsView(ListView):
    template_name = 'TravelLaborPartsLists.html'
    model = WorkOrderParts

    def get_context_data(self, **kwargs):
        id_ = self.kwargs.get('str')
        context = super().get_context_data(**kwargs)
        context['list'] = WorkOrderParts.objects.filter(wo_num=id_).order_by('wo_travel_slug')
        context['page'] = 'Parts included in order'
        context['string'] = id_
        context['label'] = 'Operation / Partnumber / Qty '
        context['data1'] = 'item.wo_part_op'
        context['data2'] = 'item.wo_part_id'
        context['data3'] = 'item.wo_part_qty'
        return context

HTML

    <h1>{{ page }}</h1>
    <h1>{{ string }}</h1>

    <l2> {{label}}  </l2>

{% for item in list %}
     <p>{{data1}} - <a >{{data2}}</a>- {{data3}}  </p>
{% endfor %}

标签: pythonhtmldjango

解决方案


我认为 Egor 的回答效果很好。因为我同时对列表实现了标准过滤功能。我发现它更容易,即使我无法判断它是好还是坏的解决方案。至少它有效。

我决定只需要有限数量的字段,因此我将它们标准化为 5 个。然后,由于我想要更好的列名,我还为每个数据子集(类)定义了一个标题。所以现在我对 8 组不同的数据使用相同的模板。

视图.py

qs = Model.objects.filter(id=id)

context = { 
    'queryset': qs.values(
        'modelfield1',
        'modelfield2',
        'modelfield5',
        'modelfield6',
        'modelfield7',
     ),
    'ListHeader': 'xxxxxxxxxxxxxxxxx',
}

这样我可以为每组数据定义不同的字段和标题。然后我使用简单的代码用一些垫片渲染出来。

在 HTML 模板中

<h5>{{ ListHeader }}</h5>
<hr/>
{% for item in queryset %}
    {% for value in item.values %}<td>..{{ value }}..|</td>{% endfor %}
{% endfor %}

推荐阅读