Как сделать поле select в Django model forms (с использованием заданных значений)?

Недавно я перешел с использования простых форм в Django на модельные формы. Сейчас я пытаюсь использовать поле select в моей форме, которая имеет заданные имена полей (например: Европа, Северная Америка, Южная Америка...). Я думал просто добавить тип ввода select к полям for, но он отображается как обычный текстовый ввод. Поле выбора должно быть "континентом". Кто-нибудь знает, как это сделать?

class TripForm(forms.ModelForm):
    # city = forms.TextInput()
    # country = forms.TimeField()
    # description = forms.Textarea()
    # photo = forms.ImageField()
    class Meta:
        model = Trip
        fields = ('city', 'country', 'continent', 'description', 'photo')

        widget = {
            'city': forms.TextInput(attrs={'class': 'form-control'}),
            'country': forms.TextInput(attrs ={'class': 'form-control'}),
            'continent': forms.SelectMultiple(attrs= {'class':'form-control'}),
            'description': forms.TextInput(attrs = {'class': 'form-control'}),
            # 'photo': forms.ImageField(attrs = {'class': 'form-control'}),
        }

[![enter image description here][1]][1]

This is the form continent should show as a select.

Здесь вы можете использовать ModelChoiceField, предоставляемый django forms. Определите модель Country, содержащую все страны, и используйте ее в качестве QuerySet здесь. Она также будет динамической и может быть изменена позже.

from django import forms
from .models import Trip, Country

class TripForm(forms.ModelForm):
    class Meta:
        model = Trip
        fields = ['name', 'country', 'start_date', 'end_date']

    
    country = forms.ModelChoiceField(
        queryset=Country.objects.all(),
        to_field_name='name',
        required=True,  
        widget=forms.Select(attrs={'class': 'form-control'})
    )

У меня была похожая проблема, и я решил ее таким образом. Извините, если поля на итальянском языке

forms.py class FormCapitoliBilancio(forms.ModelForm):

class Meta:
    model = CapitoliRiscossione
    fields = [  
                'ruolo',
                'entrata',
                'capitolo',
                'accertamento',
                'tipo'
            ]
entrata = forms.ModelChoiceField(
    queryset=DecodEquitaliaCodEntrata.objects.all().exclude(tassa = ' ').values('tassa').distinct().order_by('tassa'),
    to_field_name='tassa',
    required=True,  
    widget=forms.Select(attrs={'class': 'form-control'})
)

шаблон

                      <div class="form-group row">
                        <label class="col-sm-2 col-form-label">Entrata</label>
                        <div class="col-sm-10" onchange="verificaEntrata()">
                          <select class="js-example-basic-single col-sm-12" name="{{ form_user.entrata.name }}" id="{{ form_user.entrata.id_for_label }}">
                            {% for value, label in form_user.fields.entrata.choices %}
                            <option value="{{ value.tassa }}"{% if value.tassa == instance.entrata %} selected{% endif %}>{{ value.tassa }}</option>
                        {% endfor %}
                          </select>
                        </div>
                      </div>

views.py

def chaptersEnable(request, chapter_id): enable = SubjectMenu.objects.filter(user_menu_id=request.user, menu_princ_id=6)

if abilitazione:

    instance = get_object_or_404(CapitoliRiscossione, id=id_capitolo)
    
    elenco_entrate = DecodEquitaliaCodEntrata.objects.all().exclude(tassa = ' ').values('tassa').distinct().order_by('tassa')

    if request.method == "POST":

        form_sogg = FormCapitoliBilancio(request.POST, instance=instance)

        if form_sogg.is_valid():

            print(form_sogg.cleaned_data['entrata']['tassa'])

            form = form_sogg.save(commit=False)

            form.entrata = form_sogg.cleaned_data['entrata']['tassa']

            form.utente = request.user

            form.save()                

            return HttpResponseRedirect(reverse('capitoli_contabilita'))

    form_user = FormCapitoliBilancio(instance=instance)

    context = { 'form_user':form_user, 
                'instance':instance,
                'elenco_entrate':elenco_entrate
            }

    return render(request, "riscossione_coattiva/contabilita_capitoli_aggiorna.html", context)
Вернуться на верх