Сделать ввод формы доступным для поиска элементов из другой модели
У меня есть форма, которая будет использоваться для добавления рецепта напитка в мою базу данных. Форма позволяет добавить до 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