@nicolette.stoltenberg
В Django можно создать выпадающий список с помощью формы и полей ChoiceField или ModelChoiceField.
Пример создания выпадающего списка с данными из заданного списка:
1 2 3 4 5 6 7 8 9 |
from django import forms class MyForm(forms.Form): my_choices = ( ('value1', 'Label 1'), ('value2', 'Label 2'), ('value3', 'Label 3'), ) my_field = forms.ChoiceField(choices=my_choices, widget=forms.Select()) |
1 2 3 4 5 6 |
from django.shortcuts import render from .forms import MyForm def my_view(request): form = MyForm() return render(request, 'my_template.html', {'form': form}) |
1 2 3 4 5 |
{% csrf_token %} {{ form }} |
Теперь при отображении страницы по указанному URL будет отображаться выпадающий список с заданными значениями.
Пример создания выпадающего списка с данными из модели:
1 2 3 4 5 6 7 |
from django.db import models class MyModel(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name |
1 2 3 4 5 |
from django import forms from .models import MyModel class MyForm(forms.Form): my_field = forms.ModelChoiceField(queryset=MyModel.objects.all(), widget=forms.Select()) |
1 2 3 4 5 6 |
from django.shortcuts import render from .forms import MyForm def my_view(request): form = MyForm() return render(request, 'my_template.html', {'form': form}) |
1 2 3 4 5 |
{% csrf_token %} {{ form }} |
Теперь при отображении страницы по указанному URL будет отображаться выпадающий список с данными из модели.
@nicolette.stoltenberg
Дополнительно к вышеприведенному ответу хочу отметить, что при использовании ModelChoiceField в форме Django, необходимо учитывать методы str модели, так как они определяют представление объектов модели в виде строки и задействуются при построении выпадающего списка.ModelChoiceField используется для связывания с данными из модели и автоматического отображения в виде выпадающего списка на основе объектов модели. В примере, приведенном выше, поле my_field в форме MyForm связывается с объектами MyModel, передавая все объекты из MyModel.objects.all() в выпадающий список.
Также при использовании ModelChoiceField, рекомендуется добавить в шаблон форму вручную при помощи цикла, чтобы настроить отображение выпадающего списка более детально:
1 2 3 4 5 6 7 8 |
<form method="POST"> {% csrf_token %} <select name="my_field"> {% for obj in form.my_field %} <option value="{{ obj.value }}">{{ obj.label_tag }}</option> {% endfor %} </select> </form> |
Таким образом, можно создать более кастомизированный вывод выпадающего списка, управляя каждым элементом списка отдельно.
@nicolette.stoltenberg
Извиняюсь за недочет. Приведенный вариант позволяет больше гибкости в управлении отображением выпадающего списка в шаблоне формы. Благодаря циклу for можно настроить каждый элемент выпадающего списка по-отдельности, например, добавить дополнительные атрибуты или стили для каждого элемента. Также это даёт больше контроля над оформлением формы и элементов.Field отображается в шаблоне как обычный HTML тег select, в который автоматически вставляются элементы списка, которые можно дополнительно настраивать.