У меня возникли проблемы с созданием выпадающего списка (с активной фильтрацией поиска), которое отображает атрибут (имя) всех объектов, присутствующих в модели (курсах). Я нашел select2, чтобы быть приятным оппонентом для внедрения этого и, следовательно, установленного django-select2.Django ModelForms return from selectfield
Это то, что у меня до сих пор, содержание опущено для краткости.
models.py
class Course(models.Model):
courseID = models.CharField(max_length=6, blank="True", null="True")
name = models.CharField(max_length=256, blank="True", null="True")
hasProject = models.BooleanField(default=False)
taughtBy = models.ManyToManyField(User)
urls.py
url(r'^courses/$', courses)
forms.py
from django import forms
import django_select2
from django_select2 import *
from models import Course
class CourseForm(forms.Form): # also tried forms.ModelForm -> same results
Title = ModelSelect2Field(widget=django_select2.Select2Widget(select2_options={
'width': '400px',
'placeholder': '',
})
, queryset=Course.objects.values_list('name', flat=True))
views.py
def courses(request):
if request.method == 'POST':
form = CourseForm()
print "Form Type:", type(form)
print "ERRORS:", form.errors
if form.is_valid():
course = form.cleaned_data['Title']
print "Course Selected:", course
return HttpResponseRedirect('/home/')
else:
form = CourseForm()
return render(request, 'templates/home/courses.html', {'form': form})
courses.html
<form method="POST" id="courseForm" action="#" style="padding-bottom: 0px; margin-bottom: 0">
<div class="badge pull-right">Hint: You can start typing the title of the course</div>
{% csrf_token %}
<table>
{{ form }}
</table>
<div style="padding-left: 380px; padding-top: 10px">
<button type="submit" class="btn btn-default">Submit</button>
</div>
</form>
Проблема
Форма всегда негодный и ошибки являются пустыми. Тип формы: Type: <class 'coursereview.forms.CourseForm'>
.
Я отображения выпадающего меню как ModelForm
но плоский список содержит имя объектов и, следовательно, я получаю Type: <class 'coursereview.forms.CourseForm'>
вместо ModelForm - так что я не могу расшифровать, что был выбран курс и отображать соответствующий соответственно.
Я видел this question и думал о переопределении label_from_instance
. У меня проблемы с этим, поскольку я использую django-select2
. Я попытался сделать его ChoiceField
, но форма была по-прежнему недействительной с ошибками. Кроме того, выпадающее меню выглядело уродливее, чем у select2. : P
class CourseForm(ModelForm):
iquery = Course.objects.values_list('name', flat=True).distinct()
iquery_choices = [('', 'None')] + [(id, id) for id in iquery]
Title = forms.ChoiceField(iquery_choices,
required=False, widget=forms.Select())
class Meta:
model = Course
exclude = ('taughtBy', 'courseID', 'name', 'hasProject')
В идеале я хотел бы использовать ModelSelect2Field
, который я использовал в forms.py упоминалось ранее, и есть выбранный курс вернулся из него.
Вы должны использовать типовую форму .. Я не пробовал эту библиотеку, но Джанго-selectables работал просто отлично (вы можете посмотреть здесь https: // Джанго по выбору .readthedocs.org/en/latest/index.html) – Alvaro