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 можно повторно использовать для других моделей.

Опять же, это скорее пример/направление для дальнейших размышлений в зависимости от ваших потребностей.

Вернуться на верх