Airline 2

Django - projekt Airline

Mohou se hodit moje poznámky ke gitu

Tvorba odkazu na konkrétní let

Doplníme do šablony odkaz na konkrétní let:

<li>
    <a href="{% url 'flight' flight.id %}"> 
        Flight {{ flight.id }}: {{ flight.origin }} to {{ flight.destination }}
    </a>
</li>

A protože url 'flight' ještě nemáme, vytvoříme ji v flights\urls.py:

path("<int:flight_id>", views.flight, name="flight"),

Do souboru flights\views.py doplníme funkci pro zobrazení konkrétního letu:

def flight(request, flight_id):
    flight = Flight.objects.get(pk=flight_id)
    return render(request, "flights/flight.html", {
          "flight": flight
    })

Chci zobrazit pasažéry na webu

Do souboru flights\views.py do funkce flight, do dat pro šablonu přidám:

"passengers": flight.passengers.all()

a do šablony doplním:

 <h2>Passengers</h2>
    {% for p in passengers %}
        <li>{{p.first}} {{p.last}}</li>
    {% empty %}
        No passengers.
    {% endfor %}

Vytvořím odkaz na seznam letů

<a href="{% url 'index' %}">Back to Flight List</a>

Chci mít možnost přidat pasažéry k letu

Měli byste vědět, kam doplníte tento řádek

path("<int:flight_id>/book", views.book, name="book"),

Ve správném souboru uděláme následující změny:

from django.http import HttpResponseRedirect
from django.urls import reverse

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,)))

Upravím šablonu daného letu tak, abych tam měl formulář pro přidání pasažéra

<h2>Add Passenger</h2>
    <form action="{% url 'book' flight.id %}" method="POST">
        {% csrf_token %}
        <select name="passenger" id="passenger">
            {% for passanger in non_passengers  %}
            <option value="{{ passanger.id }}">{{ passanger }}</option>
            {% endfor %}
        </select>
        <input type="submit" value="Add Passenger">
    </form>

Do funkce flight doplním proměnou, která do šablony odešle data těch pasažérů, kteří na daném letu nejsou:

    "non_passengers": Passenger.objects.exclude(flights=flight).all()

Mohu si upravit zobrazení v admin rozhraní

V souboru admin.py provedu úpravy

class FlightAdmin(admin.ModelAdmin):
    list_display = ("id", "origin", "destination", "duration")

class PassengerAdmin(admin.ModelAdmin):
    filter_horizontal = ("flights",)

admin.site.register(Flight, FlightAdmin)
admin.site.register(Passenger, PassengerAdmin)

a aplikace je hotova.