Сортировка результатов запроса в шаблоне - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть следующая модель:

class TestCase(models.Model):
    tc_id = models.CharField(max_length=20)
    tc_title = models.CharField(max_length=500)

class TestSteps(models.Model):
    ts_case = models.ForeignKey(TestCase, on_delete=models.CASCADE)
    ts_seq_no = models.IntegerField(default=1)
    ts_instruction = models.CharField(max_length=200)

Я хочу отобразить тестовый пример вместе с соответствующими шагами теста в шаблоне.Для этого я написал два представления, одно не очень хорошее, но работает:

def tc_steps(request, pk):
    case = TestCase.objects.filter(id=pk)
    steps = TestSteps.objects.filter(ts_case_id=pk).order_by('ts_seq_no')
    context = {'case': case, 'steps': steps}
    return render(request, 'testman/tc_steps.html', context)

Не очень приятно, потому что мне нужно получить два набора запросов.Лучше иметь это:

def tc_steps(request, pk):
    case = TestCase.objects.filter(id=pk)
    return render(request, 'testman/tc_steps.html', {'case': case})

, потому что он содержит всю информацию, которая мне нужна в шаблоне.Теперь проблема:

В шаблоне для второго представления я использую следующий тег для отображения шагов теста:

{% for step in case.first.teststeps_set.all %}

, который работает, но шаги не в правильном порядке.В шаблоне для первого представления я просто использую:

{% for step in steps %}

и получаю правильный порядок (отсортированный по ts_seq_no), потому что я уже выполнил сортировку в представлении.Я пытался использовать фильтр, но не смог найти тот, который делает то, что я хочу.У меня вопрос, есть ли способ сделать order_by в теге шаблона?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Я бы добавил метод к модели TestCase, чтобы он возвращал связанные шаги в требуемом порядке.

class TestCase(models.Model):
    ...
    def ordered_steps(self):
        return self.teststeps_set.order_by('ts_seq_no')

Теперь в шаблоне вы можете сделать {% for step in case.first.ordered_steps %}.

0 голосов
/ 13 декабря 2018

Вы можете использовать dictsort вот так (используйте dictsortreversed для обратного порядка):

{% for step in case.first.teststeps_set.all|dictsort:"ts_seq_no" %}
...