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 migrateadmin.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.pypath("<int:flight_id>/book", views.book, name="book")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(),
        "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

  • アクション:データをどこに送信するかを指定します.有効なurlでなければなりません.
  • メソッド:データの送信方法を定義します.GET or POST
  • GET:「サーバはこのリソースがほしいと言っています」bodyが空のリクエスト+データがURLに含まれてサーバに送信されます.
  • POST:「サーバがデータを表示し、対応するデータを送信すると言った」データがbodyに追加されて伝送される.
  • 学習後期
    バックエンドだけをするときはhtmlプレゼンテーションではなく、データを格納したり転送したりしますが、混乱しています.
    https://youtu.be/YzP164YANAU