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 %}
Не совсем понятно, чего вы хотите добиться в конце, но я могу дать вам подсказку, в каком направлении думать.
Во-первых, вы можете определить сериализатор(ы), которые будут представлять колонки, необходимые вам из моделей. Это может быть так просто:
serializers.py
from rest_framework import serializer
class WorkOrderTravelSerializer(serializers.ModelSerializer):
class Meta:
model = models.WorkOrderTravel
fields = '__all__'
Then - когда вы получаете свои объекты, вам нужно их сериализовать. Например:
views.py
orders = WorkOrderTravel.objects.filter(wo_num=id_).order_by('wo_travel_slug')
data = WorkOrderTravelSerializer(orders, many=True).data
data
теперь будет содержать list
из json/dict
элементов - каждый из них представляет объект из 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
можно повторно использовать для других моделей.
Опять же, это скорее пример/направление для дальнейших размышлений в зависимости от ваших потребностей.