Django试图为几个不同的列表视图重复使用同一个网页



刚刚盯上了python/django。但是,努力变得比我所能胜任的更聪明。所以,如果有人有时间教育我,我会很感激;工单";。然后我得到了与每个订单相关联的数据子集。然后,我生成了一个html模板,在那里我可以在列表视图中查看订单和所有数据子集。

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

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

否则,HTML模板和视图将正常工作。

Views.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 %}

我不太清楚你最终想要实现什么,但我可以给你一条线索作为思考的方向。

首先,您可以定义序列化程序,它将表示您需要从模型中得到的列。可能就这么简单:

序列化程序.py

from rest_framework import serializer
class WorkOrderTravelSerializer(serializers.ModelSerializer):
class Meta:
model = models.WorkOrderTravel
fields = '__all__'

然后,当您获得对象时,您需要序列化它们。例如:

视图.py

orders = WorkOrderTravel.objects.filter(wo_num=id_).order_by('wo_travel_slug')
data = WorkOrderTravelSerializer(orders, many=True).data

data现在将包含json/dict项目中的list,每个项目都表示在WorkOrderTravel的对象上

现在,当您有了列和数据时,您可以将它们传递到上下文:

context = {
'work_order': {
'columns': list(data[0].keys()),  # names of columns are keys of dict
'data': [[x for x in d.values()] for d in data]  # data of columns are values of the dict
}
}

其他型号也可以重复。(您甚至可以定义一个通用的序列化程序,它将为您提供每个模型的所有字段)

现在你可以创建一个模板,它将接受你的上下文:

list_template.html

{% for column in obj.columns %}
<p>{{ column }}</p>
{% endfor }
{% for row in obj.data %}
<p>{{ data }}</p> # or whatever way you want.. it can be table for example
{% endfor %}

index.html

{% include 'list_template.html' with obj='work_order'}
{% include 'list_template.html' with obj='work_order_parts'}

因此,list_template.html可以重复用于其他模型。

同样,这是一个例子/方向,进一步思考取决于你的需求。

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

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

views.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 %}

最新更新