Поиск в форме ForeignKey по тексту в отличие от выпадающего списка - Django
Я работаю над сайтом бронирования авиабилетов на Django. В моем models.py
у меня есть две модели; одна называется Airport и одна называется Flight. Класс Flight имеет две переменные 'Departure' и 'Destination', которые наследуются от класса Airport через ForeignKey.
В конечном итоге, я хочу, чтобы пользователь мог выбрать аэропорт отправления и аэропорт назначения. Сейчас я ограничен выпадающей опцией при попытке выбора аэропортов.
Может ли кто-нибудь объяснить, как можно отредактировать мою форму, чтобы пользователь мог ввести название аэропорта, и сохраненные значения появятся на основе поиска пользователя. (Например: пользователь вводит "los" и появляется "Los Angeles", который можно выбрать.
Models.py
from django.db import models
class Airport(models.Model):
city = models.CharField(max_length=50)
code = models.CharField(max_length=3)
def __str__(self):
return f"{self.city} ({self.code})"
class Flight(models.Model):
origin = models.ForeignKey(Airport, on_delete=models.CASCADE, related_name="origin")
destination = models.ForeignKey(Airport, on_delete=models.CASCADE, related_name="destination")
length = models.IntegerField(null=False)
def __str__(self):
return f"{self.id} - {self.origin} to {self.destination}"
Ниже, в моем файле forms.py, я добавил виджет dict, который позволил мне теперь вводить значение в форму вместо выпадающего меню. Однако он не предлагает результаты, основанные на поиске, и не подсказывает ни один из сохраненных аэропортов.
Forms.py
from django import forms
from .models import Airport, Flight
from django.forms import CharField
class citySearch(forms.ModelForm):
class Meta:
model = Flight
fields = ['origin', 'destination']
widgets = {
"origin": forms.TextInput,
"destination": forms.TextInput
}
Ниже, в моем файле views.py; я знаю, что здесь есть странный код, но я оставляю его, чтобы не было "ошибок".
views.py
from django.shortcuts import render
from .models import Airport, Flight
from .forms import citySearch
def index(request):
airports = Airport.objects.all()
context ={
"airports": airports,
}
return render(request, "base/index.html" , context)
def book(request):
form = citySearch()
context = {
"form": form,
}
if request.method == 'POST':
form = citySearch(request.POST)
if form.is_valid():
form.save()
context = {"form": form}
return render(request, "base/book.html" , context)
Последним является мой HTML файл. Просто добавляю его на всякий случай!
index.html
<!DOCTYPE html>
<html>
<head>
<title> Flights </title>
</head>
<body>
<form method='POST' action="{% url 'book' %}"> {% csrf_token %}
<p>{{ form }}</p>
<input type="submit" value ='Search'/>
</form>
<h3> Finding flights</h3>
<h1> from {{ departure }} to {{destination}}</h1>
</body>
</html>
Надеюсь, это было понятно. Я не думал, что это будет так сложно.
Мне кажется, что я перепробовал все, но опять же все, что я просмотрел, было разным и трудно применимо к моему конкретному случаю.