manytomany字段在形式与复选框insted选择字段在Django模板中

时间:2011-12-25 18:49:20

标签: django django-forms django-templates

我有ManyToManyField的模型。现在我需要表单,但不需要在模板中选择字段。

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)

我真正需要的是使用模板中的复选框显示Foo模型中的所有数据,而不是使用模型中的select.Form和{{form}}调用中的select字段。

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()
    ...

1 个答案:

答案 0 :(得分: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(),}