2013-10-07 46 views
0

我在構建顯示模型(課程)中存在的所有對象的屬性(名稱)的下拉列表(具有活動搜索過濾器)時遇到問題。我發現select2是一個很好的opton來暗示這一點,因此安裝django-select2Django ModelForms從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

你必須使用雛型。我還沒有嘗試過這個庫,但Django的selectables工作就好了(你可以在這裏看看https://開頭的Django可選.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

試過了,現在我從打印語句中得到了這個。 表單類型: 錯誤:

  • 標題
    • 選擇一個有效的選項。該選擇不是可用選擇之一。
vinayakshukl

+0

無論我選擇哪個選項 - 它也顯示相同的錯誤。 – vinayakshukl

+0

我試着在ChoiceField窗體中使用相同的問題。它實際上返回了選擇的正確路線。如果我開始輸入課程名稱的子集(它在select2中起作用),搜索不起作用, – vinayakshukl