Итак, в моем models.py есть следующее:
UNITY_CHOICES = (
('g', 'Gram(s)'),
('kg', 'Kilogram(s)'),
('l', 'Liter(s)'),
('cl', 'Centiliter(s)'),
)
class Recipe_Ingredient(models.Model):
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
quantity = models.FloatField()
cost = models.DecimalField(max_digits=20, decimal_places=2)
quantityUnit = models.CharField(
max_length=2,
choices=UNITY_CHOICES,
default=GRAM,
)
class Ingredient(models.Model):
name = models.CharField(max_length=200)
articleNumber = models.IntegerField(unique=True)
costPrice = models.DecimalField(max_digits=20, decimal_places=2)
costAmout = models.FloatField()
costUnity = models.CharField(
max_length=2,
choices=UNITY_CHOICES,
default=GRAM,
)
И у меня есть простая форма для добавления этой модели в мою базу данных:
class Recipe_IngredientForm(forms.ModelForm):
class Meta:
model = Recipe_Ingredient
fields = ('quantity', 'quantityUnit', 'ingredient')
Поэтому мне было интересно, есть ли способ отфильтровать доступные варианты QuantityUnit в зависимости от выбранного ингредиента. Я попытаюсь прояснить это на примере: скажем, я решил добавить Potato, а costUnity для Potato - это «g», затем я хочу сделать «kg» и «g» единственными вариантами для amountUnit. Это хороший пример? Я могу попытаться придумать что-нибудь получше, если это недостаточно ясно. В любом случае, возможно ли такое? Спасибо.
ОБНОВИТЬ: forms.py:
class Recipe_IngredientForm(forms.ModelForm):
class Meta:
model = Recipe_Ingredient
fields = ('quantity', 'quantityUnit', 'ingredient')
шаблон:
{% extends 'recipe/base.html' %}
{% block content %}
<h1>Add Ingredient to Recipe</h1>
<form method = "POST" class = "post-form">{% csrf_token %}
{{ form.as_p }}
<button type = "submit" class = "save btn btn-default">Save</button>
</form>
{% endblock %}
Визуализированный HTML:
<h1>Add Ingredient to Recipe</h1>
<form method = "POST" class = "post-form"><input type = "hidden" name = "csrfmiddlewaretoken" value = "tXVR3NM1R4TBwOJArWWClL71r8S5C18gWKz9mKK42wlEamf6NcBjzrieF5dQBOaO">
<p>
<label for = "id_quantity">Quantity:</label>
<input type = "number" name = "quantity" required = "" id = "id_quantity" step = "any">
</p>
<p>
<label for = "id_quantityUnit">QuantityUnit:</label>
<select name = "quantityUnit" id = "id_quantityUnit">
<option value = "g" selected = "">Gram(s)</option>
<option value = "kg">Kilogram(s)</option>
<option value = "l">Liter(s)</option>
<option value = "cl">Centiliter(s)</option>
</select>
</p>
<p>
<label for = "id_ingredient">Ingredient:</label> <select name = "ingredient" required = "" id = "id_ingredient">
<option value = "" selected = "">---------</option>
<option value = "1">Carrot</option>
<option value = "2">Potato</option>
<option value = "3">Water</option>
<option value = "4">Juice</option>
</select>
</p>
<button type = "submit" class = "save btn btn-default">Save</button>
</form>
Я не думаю, что это возможно, если вы не используете JQuery или другие Javascripts для их динамического рендеринга.
@robotHamster Итак, мне пришлось бы разместить тег скрипта в нижней части шаблона, где вызывается моя форма. Но как мне получить выбранный ингредиент и атрибут costUnity для этого выбранного ингредиента?
Вы можете использовать вызовы jQuery AJAX для обновления информации из вашей базы данных.
@robotHamster Я добавил скрипт внизу и сработал при изменении поля выбора, но я до сих пор не знаю, как получить атрибут costUnity из выбранного ингредиента. Можете ли вы мне помочь? Может быть, на простом примере?
чтобы помочь вам с некоторым jQuery, мне нужно было бы увидеть ваш обработанный HTML, пожалуйста, обновите свой пост, чтобы включить его
@robotHamster Хорошо, я обновил его своей формой и шаблоном. Я использую Django Forms, и когда я проверяю, я вижу, что поле выбора ингредиентов получает идентификатор «id_ingredient» и единство выбора «id_quantityUnit».
@robotHamster, если вам нужно увидеть, как мой views.py обрабатывает форму, дайте мне знать.
@robotHamster, я только что добавил к нему отрисованный html.
У меня все заработало, я отправлю свой ответ позже, когда буду дома.






Да, это возможно с использованием Javascrip / jQuery в вашем шаблоне. Вот ответ на несколько похожий вопрос. Вам придется поиграться с вашими элементами
option