Отключить выбор опции charField в зависимости от другого атрибута (Django)

Итак, в моем 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>

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

robotHamster 20.11.2018 05:00

Я не думаю, что это возможно, если вы не используете JQuery или другие Javascripts для их динамического рендеринга.

ruddra 20.11.2018 05:22

@robotHamster Итак, мне пришлось бы разместить тег скрипта в нижней части шаблона, где вызывается моя форма. Но как мне получить выбранный ингредиент и атрибут costUnity для этого выбранного ингредиента?

Luc 20.11.2018 11:31

Вы можете использовать вызовы jQuery AJAX для обновления информации из вашей базы данных.

robotHamster 20.11.2018 19:04

@robotHamster Я добавил скрипт внизу и сработал при изменении поля выбора, но я до сих пор не знаю, как получить атрибут costUnity из выбранного ингредиента. Можете ли вы мне помочь? Может быть, на простом примере?

Luc 21.11.2018 00:17

чтобы помочь вам с некоторым jQuery, мне нужно было бы увидеть ваш обработанный HTML, пожалуйста, обновите свой пост, чтобы включить его

robotHamster 21.11.2018 05:56

@robotHamster Хорошо, я обновил его своей формой и шаблоном. Я использую Django Forms, и когда я проверяю, я вижу, что поле выбора ингредиентов получает идентификатор «id_ingredient» и единство выбора «id_quantityUnit».

Luc 21.11.2018 10:36

@robotHamster, если вам нужно увидеть, как мой views.py обрабатывает форму, дайте мне знать.

Luc 21.11.2018 10:39

@robotHamster, я только что добавил к нему отрисованный html.

Luc 21.11.2018 19:20

У меня все заработало, я отправлю свой ответ позже, когда буду дома.

Luc 21.11.2018 20:54
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
10
52
0

Другие вопросы по теме