刚刚盯上了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 %}