我有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()
...
答案 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(),}