Django Queryset один и тот же шаблон для разных представлений - PullRequest
0 голосов
/ 25 марта 2020

У меня есть две функции просмотра в view.py

def function1(request):
   qset = Table1.objects.values(
    'Field1__code',
    'Field2__descr',
    'Field3__nr',   
    ...
    )

return render(request, 'template.html', {'qset':qset})


def function2(request):
   qset = Table2.objects.values(
    'Field4__abc',
    'Field5__def',
    'Field6__fgh',  
    ...
    )

return render(request, 'template.html', {'qset':qset})

Я хочу использовать один и тот же шаблон. html для обоих представлений. Как я могу отправить из обеих функций в содержимом {'qset': qset} в шаблон одинаковые имена ключей, такие как "x1", "x2", "x3" (или qset.x1, qset.x2, qset.x3) вместо отправки двух разных наборов ключей? Шаблон. html содержит ключи "x1", "x2", "x3". Спасибо

1 Ответ

0 голосов
/ 25 марта 2020

Есть три варианта, о которых я могу быстро подумать.

Во-первых, вы используете .values_list и используете позиционное индексирование, а не ключи. Так что в вашем вопросе вы спрашиваете qset.x1, .... Вы бы использовали qset.0, qset.1 вместо этого. Однако это трудно поддерживать.

Во-вторых, вы можете аннотировать набор запросов, чтобы определить поля:

Table2.objects.annotate(
    x1=F('Field4__abc'),
    x2=F('Field5__def'),
    ...
).values('x1', 'x2', ...)

В-третьих, вы можете создать фиктивную модель представления для перевода экземпляров Model в it.

class ViewModel:
    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)

def function2(request):
    table2s = Table2.objects.all()
    data = [
        ViewModel(x1=obj.Field4.abc, x2=Field5.def, ...)
        for obj in table2s
    ]
    return render(request, 'template.html', {'data':data})

Количество полей и сложность логики c определит, что подойдет вам лучше всего.

...