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.