JawsIk
@JawsIk
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)

Как в Django шаблоне вывести в форме (в секции SELECT) через {% for, значения из ForeignKey?

Имеется простая модель:
class ModelPi(models.Model):
    material = models.ForeignKey(Material, on_delete=models.PROTECT)
    title = models.CharField(max_length=50, unique=True)
    is_active = models.BooleanField(default=True)
    priority = models.IntegerField(default=0, verbose_name='Приоритет сортировки')


модель материалов ещё проще:
class Material(models.Model):
    title = models.CharField(max_length=50, verbose_name="Материал", unique=True)


Имеется класс формы:
class ModelPiForm(forms.ModelForm):
    class Meta:
        model = ModelPi
        fields = ['title', 'material', 'priority', 'is_active']
        labels = {
            'title': 'Название Модели',
            'material': 'Материал',
            'priority': 'Приоритет сортировки',
            'is_active': 'Активна (включена)',
        }
        help_texts = {
            'priority': 'используется для отображения порядка при выборе, чем больше число, тем выше в списке',
            'is_active': 'если выключено, то не показывается в каталоге',
        }


Т.е. мы видим, что у нас есть внешний ключ на материалы.

Но шаблон очень хитрый и использует свои классы, JS и прочие заморочки. Поэтому я вывожу все поля вручную. Например то же поле title я вывожу подобным образом:
<div class="md-form mb-0">
    <input type="text" id="title" name="title" class="form-control"
                value="{{ form.title.value|default_if_none:'' }}">
    <label for="title" class="">{{ form.title.label }}</label>
</div>


Но Как через {% for ... %} вывести значения материала например в секции SELECT ?

<select class="mdb-select md-form" id="material" name="material">
     <option value="" disabled selected>Выберите материал, нажав здесь</option>
     {% for material in form.material %}
     <option value="{{ material.id }}">{{ material.title }}</option> ### так не работает!
     {% endfor %}
</select>
  • Вопрос задан
  • 2474 просмотра
Решения вопроса 1
JawsIk
@JawsIk Автор вопроса
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
По совету, уважаемого Павла Денисова, я стал копать в предложенном им направлении. И в итоге пришёл к следующему варианту:
<select class="mdb-select md-form" id="material" name="material">
    {% for material in form.material.field.choices.queryset %}
    <option value="{{ material.id }}">{{ material.title }}</option>
    {% endfor %}
</select>


Соответственно, если нужно по пути выбрать нужный вариант (если это не страница добавления, а к примеру страница правки), то добавляется ещё один if:
<select class="mdb-select md-form" id="material" name="material">
    {% for material in form.material.field.choices.queryset %}
    <option value="{{ material.id }}"
    {% if material.id == modelpi.material.id %} selected="selected"{% endif %}
    >{{ material.title }}</option>
    {% endfor %}
</select>

Не забудьте "передать" модель (в примере это ModelPi) в шаблон.

Кстати, обратив внимание на choices, я попробовал подобную конструкцию и с CHOICES.
Чтобы не повторяться, покажу, как это сделать с radio button (радио переключателями)
Делается похоже, но всё-же:
{% for choice in form.type.field.choices %}
    <div class="form-check">
        <input type="radio"
	             class="form-check-input my-change"
               id="{{ form.type.name }}_{{ forloop.counter0 }}"
               name="{{ form.type.name }}"
               value="{{ choice.0 }}"{% if choice.0 == additionalproperty.type %} checked="checked"{% endif %}>
        <label class="form-check-label"
               for="{{ form.type.name }}_{{ forloop.counter0 }}">{{ choice.1 }}</label>
   </div>
{% endfor %}

Не забудьте "передать" модель (в коде выше это AdditionalProperty) в шаблон.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы