Интерактивный выпадающий список django с возможностью добавления нового элемента
Я относительно новичок в django. Я сделал простое приложение, которое позволяет пользователю записывать подробности о пробежке (Activity). Пользователь вводит такие данные, как: расстояние, время, название маршрута, дата пробежки... и т.д., используя django ModelForm.
У меня есть ModelForm, которая позволяет зарегистрированному пользователю добавить Activity в базу данных модели.
Как заставить форму добавить выпадающий список всех маршрутов, которые уже есть в базе данных модели, и добавить новый, если человек вводит данные о маршруте, который он раньше не проходил?
class Person(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
fName = models.CharField(max_length =100)
lName = models.CharField(max_length =100)
weight = models.FloatField()
sex = models.CharField(max_length=10)
def __str__(self):
return self.lName
class Activity(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
length = models.FloatField()
runTime = models.DurationField()
route = models.CharField(max_length=100)
ave = models.DurationField()
dateRun = models.DateField()
marathon = models.DurationField()
def __str__(self):
return self.route ```
Я бы добавил модель Route в models.py:
class Person(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
fName = models.CharField(max_length=100)
lName = models.CharField(max_length=100)
weight = models.FloatField()
sex = models.CharField(max_length=10)
def __str__(self):
return self.lName
class Route(model.model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
length = models.FloatField()
route = models.CharField(max_length=100)
class Activity(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
runTime = models.DurationField()
route = models.ForeignKey(Route, on_delete=models.CASCADE)
ave = models.DurationField()
dateRun = models.DateField()
marathon = models.DurationField()
def __str__(self):
return self.route
Когда человек хочет добавить активность, у него будут все маршруты, которые он вводил ранее. Это решение требует дополнительной работы в modelform, и нужна еще одна форма для добавления нового маршрута. Я думаю, что форма ActivityForm должна выглядеть следующим образом:
class ActivityForm(forms.ModelForm):
class Meta:
model = Activity
fields = '__all__'
widgets = {'person': forms.HiddenInput}
и инициируйте его в файле views.py:
form = ActivityForm(initial={'person': request.user.id})
form.field['route'].queryset = Route.objects.filter(person=request.user)