2010-08-11 55 views
2

我有一個ManyToManyField,我想在窗體中顯示爲CheckboxSelectMultiple小部件。爲什麼這些方法都不行? (請參閱下面的嘗試#1,#2和#3)。根據我在文檔和SO上閱讀的所有內容,至少其中一個應該工作。但我仍然有一個頑固的SelectMultiple小部件,拒絕讓步。無法覆蓋ModelForm(Django)中的SelectMultiple小部件

from django.forms.widgets import CheckboxSelectMultiple 
from django.db import models 
from django import forms 

KEYWORD_CHOICES = (('sky', 'sky'),('wind','wind'),) 

class Keyword(models.Model): 
    keyword = models.CharField(max_length=50) 
    def __unicode__(self): 
     return self.keyword 

class Feedback(models.Model): 
    summary = models.CharField(max_length=200) 
    keys = models.ManyToManyField(Keyword, blank=True, null=True) 

################################### 
class FeedbackForm(forms.ModelForm): 
    # attempt 1 
    # based on 
    # http://docs.djangoproject.com/en/dev/ref/forms/widgets/#specifying-widgets 
    keys = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, 
            choices=KEYWORD_CHOICES) 
    class Meta: 
     model = Feedback 
     # attempt 2 
     # based on 
     # http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-default-field-types-or-widgets 
     widgets = { 
      'keys':CheckboxSelectMultiple(), 
      } 
    # attempt 3 
    # based on 
    # bitkickers.blogspot.com/2010/05/django-manytomanyfield-on-modelform-as.html 
    def __init__(self, *args, **kwargs): 
     super(FeedbackForm, self).__init__(*args, **kwargs) 
     self.fields["keys"].widget = CheckboxSelectMultiple() 
     self.fields["keys"].queryset = Keywords.objects.all() 

我用夾具來填充我的初始Keyword實例。

我也嘗試覆蓋help_text沒有成功。

在我views.py我使用一個formset:

from app.models import * 
from django.forms.models import modelformset_factory 

def submit(request):  
    FeedbackFormSet = modelformset_factory(Feedback, extra=1)  
    #[...]  
    feedbackforms = FeedbackFormSet(prefix='feedback',queryset=Feedback.objects.none()) 

但我不明白怎麼會有所作爲。

我正在使用Django版本1.2.1。

回答

5

你必須告訴modelformset_factory使用您的自定義FeedbackForm

FeedbackFormSet = modelformset_factory(Feedback, form=FeedbackForm, extra=1) 

之後,你的三個途徑之一應該工作(我更喜歡第二個Django的1.2)。

+0

Facepalm。謝謝。 和FWIW有一個formset_factory方法的錯誤,這意味着上面的方法#2不起作用。 http://code.djangoproject.com/ticket/13095但方法#1工作得很好。 :) – pfctdayelise 2010-08-11 09:01:59

+0

我花了最後3個小時試圖弄清楚這一點,謝謝謝謝謝謝你! Django文檔對於這種定製是垃圾:/ – 2011-03-12 13:42:50