2013-10-07 5 views
0

У меня возникли проблемы с созданием выпадающего списка (с активной фильтрацией поиска), которое отображает атрибут (имя) всех объектов, присутствующих в модели (курсах). Я нашел 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 упоминалось ранее, и есть выбранный курс вернулся из него.

+0

Вы должны использовать типовую форму .. Я не пробовал эту библиотеку, но Джанго-selectables работал просто отлично (вы можете посмотреть здесь https: // Джанго по выбору .readthedocs.org/en/latest/index.html) – Alvaro

ответ

0

Ошибка не имеет ничего общего с тем, какое поле выбора вы используете. Вы просто не передаете данные POST в форму.

У вас также есть некоторые ошибки отступов в остальной части представления. Все это должно быть:

if request.method == 'POST': 
    form = CourseForm(request.POST) 
    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}) 
+0

Пробовал это, теперь я получаю это от операторов печати. Тип формы: <класс 'coursereview.forms.CourseForm '> ОШИБКИ:

  • Заголовок
    • Выберите действительный выбор. Этот выбор не является одним из доступных вариантов.
vinayakshukl

+0

Независимо от того, какой вариант я выбираю - он показывает ту же ошибку, также на странице html. – vinayakshukl

+0

Я пробовал то же самое с формой ChoiceField, как упоминалось в вопросе. Он фактически вернул правильный курс. Поиск не работает, если я начну вводить подмножество имени курса (он работает в select2) – vinayakshukl

Смежные вопросы