Я создал представление, которое добавляет остановки в маршрут, и они не отображаются по порядку параметров из моделей.

Я создал представление, в котором я добавляю остановки к маршруту, оно работает нормально, но остановки не отображаются по порядку, когда я их добавляю, и я понятия не имею почему. Пожалуйста, подскажите, где я допускаю ошибку

Вот мой код:

Модели:

class Port(models.Model):
    name = models.CharField(max_length=128)
    description = models.TextField(default='')
    lattitude = models.DecimalField(max_digits=9, decimal_places=6)
    longitude = models.DecimalField(max_digits=9, decimal_places=6)
    amenities = models.ManyToManyField(Amenity, blank=True)

    def __str__(self):
        return f'{self.name}'

class Route(models.Model):
    name = models.CharField(max_length=128, default='')
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    stop_list = models.ManyToManyField(Port, through='RoutePort')

    def __str__(self):
        return f'{self.name}'



class RoutePort(models.Model):
    port = models.ForeignKey(Port, on_delete=models.CASCADE)
    route = models.ForeignKey(Route, on_delete=models.CASCADE)
    order = models.PositiveIntegerField()

    class Meta:
        ordering = ['order']

порядок, в котором они должны появляться, задается параметром 'order' из класса routeport

Форма:

class AddRoutePort(forms.ModelForm):

    class Meta:
        model = RoutePort
        fields = ['port', 'order']

форма короткая, и я не знаю, не забыл ли я там что-нибудь

View, get работает правильно, post работает почти нормально. Новые порты корректно добавляются в новый маршрут из списка, но они появляются в порядке добавления, а не так, как я хотел.

class RouteCorrectView(View):

    def get(self, request, pk):
        route = Route.objects.get(pk=pk)
        form = AddRoutePort()
        return render(request, 'route_correct.html', {'route':route, 'form':form})


    def post(self, request, pk):
        route = Route.objects.get(pk=pk)
        form = AddRoutePort(request.POST)
        if form.is_valid():
            to_port = form.save(commit=False)
            to_port.route = route
            order = to_port.order
            ordering = RoutePort.objects.filter(order__gte=order, route=route)
            for port in ordering:
                port.order += 1
                port.save()
            to_port.save()
            return redirect('route_correct', pk)
        return render(request, 'route_correct.html', {'route':route, 'form':form})

и HTML - я не могу нарисовать здесь установленный порядок, поэтому я думаю, что где-то ранее была допущена ошибка. Строка {{ stops.order }} ничего не делает.

{% extends 'base.html' %}
{% block content %}
    <div class="card">
    <ul>Nazwa</ul>
        <p>{{ route.name }}</p>
    <ul>Twórca</ul>
        <p> {{ route.user }}</p>
    <ul>Szlak</ul>
        <td> {% for stops in route.stop_list.all %}
        {{ stops }} {{ stops.order }}
            <td>
            <form action="{% url 'delete_stop' stops.id %}" method="get"> {% csrf_token %}
                <input type="submit">usuń</form>
            <form action="{% url 'port_detail' stops.id %}" method="get"> {% csrf_token %}
                <input type="submit">o porcie</form><br>
        </td>
            {% empty %}
            Szlak jest jeszcze pusty
        {% endfor %}</td>
    </div>

    <form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit">
</form>



    </div>

{% endblock %}

Итак, я нашел решение. Во-первых, я идиот, во-вторых, проблема была в html

<td> {% for stops in route.stop_list.all %}
    {{ stops }} {{ stops.order }}
        <td>

Вышеуказанная часть относится к стоп-листу, а не к модели routeport с "order" в нем. Это должно выглядеть следующим образом:

<td> {% for stops in route.routeport_set.all %}
    {{ stops.port }}  {{ stops.order }}
        <td>
        

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

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