Many-to-many
Flightと多対多関係Passengerモデルを作成します。
models.pyでPassengerを作成して移行します.
class Passenger(models.Model):
first = models.CharField(max_length=64)
last = models.CharField(max_length=64)
flights = models.ManyToManyField(Flight, blank=True, related_name="passengers")
def __str__(self):
return f"{self.first} {self.last}"
python manage.py makemigrations
python manage.py migrate
admin.pyにPassengerを追加しadminページに進む複数のFlightsを選択できます.
フライトの乗客情報を見てみましょう。
views.乗客をpyの飛行方法に追加します.
def flight(request, flight_id):
flight = Flight.objects.get(pk=flight_id)
return render(request, "flights/flight.html", {
"flight": flight,
"passengers": flight.passengers.all()
})
flight.乗客部分をhtmlに追加すると、 <h2>Passengers</h2>
<ul>
{% for passenger in passengers %}
<li>{{ passenger }}</li>
{% empty %}
<li>No passengers.</li>
{% endfor %}
</ul>
/flights/1に行くと1便分の乗客が見えます.Book:特定のフライトのnon乗客の1人を選択し、乗客リストに入れます。
urls.py
path("<int:flight_id>/book", views.book, name="book")
views.pydef flight(request, flight_id):
flight = Flight.objects.get(pk=flight_id)
return render(request, "flights/flight.html", {
"flight": flight,
"passengers": flight.passengers.all(),
"non_passengers":Passenger.objects.exclude(flights=flight).all()
})
def book(request, flight_id):
if request.method == "POST":
flight = Flight.objects.get(pk=flight_id)
passenger = Passenger.objects.get(pk=int(request.POST["passenger"]))
passenger.flights.add(flight)
return HttpResponseRedirect(reverse("flight", args=(flight.id,)))
flight.html <h2>Add Passenger</h2>
<form action="{% url 'book' flight.id %}" method="post">
{% csrf_token %}
<select name="passenger">
{% for passenger in non_passengers %}
<option value="{{ passenger.id }}">{{ passenger }}</option>
{% endfor %}
</select>
<input type="submit">
</form>
<form> tag
バックエンドだけをするときはhtmlプレゼンテーションではなく、データを格納したり転送したりしますが、混乱しています.
https://youtu.be/YzP164YANAU
Reference
この問題について(Many-to-many), 我々は、より多くの情報をここで見つけました https://velog.io/@shinuhyun/Many-to-manyテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol