Я создал представление, которое добавляет остановки в маршрут, и они не отображаются по порядку параметров из моделей.
Я создал представление, в котором я добавляю остановки к маршруту, оно работает нормально, но остановки не отображаются по порядку, когда я их добавляю, и я понятия не имею почему. Пожалуйста, подскажите, где я допускаю ошибку
Вот мой код:
Модели:
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>
где я ссылаюсь на маршрутный лист с порядком в нем.