Сделать ввод формы доступным для поиска элементов из другой модели

У меня есть форма, которая будет использоваться для добавления рецепта напитка в мою базу данных. Форма позволяет добавить до 10 ингредиентов и их количество, а также информацию, название и фотографию напитка.

Теперь я хочу, чтобы текстовые блоки ввода были связаны с моделью, которая содержит все возможные ингредиенты в моей базе данных. Я бы хотел, чтобы эти текстовые блоки работали как панель поиска ингредиентов. Есть ли способ заставить это работать? см. мою установку ниже:

Вид шаблона на данный момент:

{% extends 'base.html' %}

{% block content %}

<div class='container'>

    <div class='row'>

<form method="POST" enctype='multipart/form-data'>
    {% csrf_token %}

    <div class='row'>

        <div class='col'>
            <div class='mb-5'>
            {{form.drink_name.label_tag}}
            <br>
            {{form.drink_name}}
            </div>
  
            {% for ingredients in form  %}
                {% if forloop.counter < 21 %}
                {{ingredients.label_tag}}  
                <br>  
                {{ingredients}}
                <br>
                {% endif %}
            {% endfor %}
        </div>

        <div class='col'>
            {% for ingredients in form  %}
                {% if forloop.counter > 21 %}
                    {{ingredients.label_tag}}  
                    <br>  
                    {{ingredients}}
                    <br>
                {% endif %}
            {% endfor %}
        </div>
        <div class='row my-4'>
            <input type='submit' value='submit' class='my-2'>
        </div>
</form>

</div>



{% endblock content %}

Модели:

модель ингредиента:

class Bottle(models.Model):
    category_name = models.ForeignKey('Category', on_delete=models.SET_NULL,null=True,blank=True)
    brand = models.ForeignKey('Brand', on_delete=models.CASCADE)
    bottle_name = models.CharField(max_length=255)
    bottle_info = models.TextField()
    bottle_tasting_notes = models.TextField()
    bottle_barcode = models.IntegerField()
    bottle_image = ResizedImageField(upload_to='bottles/',null=True, blank=True)
    bottle_shop_link = models.CharField(max_length=250, null=True, blank=True)

    def __str__(self):
        return f"{self.brand}, {self.bottle_name}"

Модель рецепта:

class Recipe(models.Model):
    ingr_name1 = models.CharField(max_length=250, verbose_name='Ingredient')
    ingr_amount1 = models.DecimalField(max_digits=5, decimal_places=1, verbose_name='Amount')
    ingr_name2 = models.CharField(max_length=250, blank=True, null=True, verbose_name='Ingredient')
    ingr_amount2 = models.DecimalField(max_digits=5, decimal_places=1,blank=True, null=True, verbose_name='Amount')
    ingr_name3 = models.CharField(max_length=250,blank=True, null=True, verbose_name='Ingredient')
    ingr_amount3 = models.DecimalField(max_digits=5, decimal_places=1,blank=True, null=True, verbose_name='Amount')
    ingr_name4 = models.CharField(max_length=250,blank=True, null=True, verbose_name='Ingredient')
    ingr_amount4 = models.DecimalField(max_digits=5, decimal_places=1,blank=True, null=True, verbose_name='Amount')
    ingr_name5 = models.CharField(max_length=250,blank=True, null=True, verbose_name='Ingredient')
    ingr_amount5 = models.DecimalField(max_digits=5, decimal_places=1,blank=True, null=True, verbose_name='Amount')
    ingr_name6 = models.CharField(max_length=250,blank=True, null=True, verbose_name='Ingredient')
    ingr_amount6 = models.DecimalField(max_digits=5, decimal_places=1,blank=True, null=True, verbose_name='Amount')
    ingr_name7 = models.CharField(max_length=250,blank=True, null=True, verbose_name='Ingredient')
    ingr_amount7 = models.DecimalField(max_digits=5, decimal_places=1,blank=True, null=True, verbose_name='Amount')
    ingr_name8 = models.CharField(max_length=250,blank=True, null=True, verbose_name='Ingredient')
    ingr_amount8 = models.DecimalField(max_digits=5, decimal_places=1,blank=True, null=True, verbose_name='Amount')
    ingr_name9 = models.CharField(max_length=250,blank=True, null=True, verbose_name='Ingredient')
    ingr_amount9 = models.DecimalField(max_digits=5, decimal_places=1,blank=True, null=True, verbose_name='Amount')
    ingr_name10 = models.CharField(max_length=250,blank=True, null=True, verbose_name='Ingredient')
    ingr_amount10 = models.DecimalField(max_digits=5, decimal_places=1,blank=True, null=True, verbose_name='Amount')
    drink_name = models.CharField(max_length=250,blank=True, null=True, verbose_name='Drink name')
    drink_story = models.TextField()
    drink_picture = ResizedImageField(upload_to='drinks/', null=True, blank=True)

Представление для рецепта:

class AddDrinkFormView(FormView):
    form_class = AddDrinkForm
    template_name = 'academy/addDrinkForm.html'

    success_url = '/academy/add_drink'

    def form_valid(self, form):
        form.save()
        return super().form_valid(form)

    def get_context_data(self, **kwargs):
        context = super(AddDrinkFormView, self).get_context_data(**kwargs)
        context ['bottles'] = Bottle.objects.all()
        return context
Вернуться на верх