Как сделать поле 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)