2011-12-25 27 views
2

我有ManyToManyField模型。現在我需要表單,但不需要模板中的選擇字段。多種多樣的領域形式與複選框insted django模板中的選擇字段

class Foo(models.Model): 
    name = models.CharField(max_length=50) 
    short_description = models.CharField(max_length=100) 
    price = models.IntegerField() 

    def __unicode__(self): 
     return self.name 

class Bar(models.Model): 
    foo = models.ManyToManyField(Foo, blank=True, null=True, related_name='foos') 

    def __unicode__(self): 
     return unicode(self.id) 

我真正需要的是從模板複選框的富模型顯示所有數據,而不是選擇字段,我有,如果使用model.Form和模板{{形式}}調用。

class BarForm(forms.ModelForm): 
    class Meta: 
     model = Bar 

view.py

def show_form(request, id): 
    foo = get_object_or_404(Foo, id=id) 
    form = BarForm() 
    ... 
+0

答案搜索「多對多的複選框」 http://stackoverflow.com/questions/1760421/how-can-i-render-a-manytomanyfield-as-checkboxes – 2011-12-25 19:29:50

回答

3

要顯示ManyToManyField爲複選框,而不是選擇字段,你需要設置控件的Meta類適當ModelForm子類。然後在每個複選框create your own form field class derived from ModelMultipleChoiceField, and override label_from_instance上顯示自定義標籤。您也可以將HTML標籤添加到由label_from_instance返回的字符串中,以使其看起來像您想要的那樣美觀,但請記住將返回的字符串換成mark_safe

from django.forms.widgets import CheckboxSelectMultiple 
from django.forms.models import ModelMultipleChoiceField 
... 
class CustomSelectMultiple(ModelMultipleChoiceField): 
    def label_from_instance(self, obj): 
     return "%s: %s %s" %(obj.name, obj.short_description, obj.price) 

class BarForm(forms.ModelForm): 
    foo = CustomSelectMultiple(queryset=Foo.objects.all()) 
    class Meta: 
     model = Bar 
     widgets = {"foo":CheckboxSelectMultiple(),} 
+0

感謝西蒙。當我將我的真實模型名稱翻譯爲foo/bar模型名稱時出現錯誤。其實它是'BarForm'。我只是試圖使用'CheckboxSelectMultiple',我有複選框名稱的unicode。如何獲取模板中的所有對象數據?名稱,簡短描述和價格與複選框? – Goran 2011-12-25 19:52:20

+0

我已經編輯了我的答案,以使用正確的類/變量名稱,並且還添加了關於如何自定義每個複選框上的標籤的信息(如果您要編輯問題以避免混淆,那也會很好。我希望它有幫助! – 2011-12-25 20:21:38

+0

似乎我迷失了使用此代碼的模板中的複選框。現在我擁有所有數據,但在選擇字段中,而不是複選框。 'widgets = {「foo」:CheckboxSelectMultiple(),}'不再工作。 – Goran 2011-12-25 21:44:57