Интерактивный выпадающий список 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)
Вернуться на верх