模型表单 - 如何更改默认的ManyToMany小部件?

时间:2013-11-28 09:40:46

标签: django

我使用Django Model Form:

class Fruit(models.Model):
    name = models.CharField(max_length=40)

class Box(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=199)
    fruit = models.ManyToManyField(Fruit)

和forms.py:

class BoxModelForm(ModelForm):
    class Meta:
        model = Box

我在表单中有默认的django ManyToMany小部件:

http://nov.imghost.us/ly5M.png

如何将其更改为输入(文本类型),如果我输入此输入:

  

apple,banana,lemon - 逗号分隔

这个Fruit会被创建吗?

2 个答案:

答案 0 :(得分:2)

如文档中所述:https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-default-fields 您可以向Meta的{​​{1}}添加小部件属性,以更改表单中使用的默认小部件。

在你的情况下,它会是这样的:

Modelform

但实际上,对于你想要实现的行为,你可以采取另一种方式。 您应该添加一个额外的文本字段,并在保存步骤中编写水果的添加/删除,同时在干净步骤中检查不同标记的有效性。

class BoxModelForm(ModelForm):
    class Meta:
        model = Box
        widgets = {
            'fruit': TheWidgetYouWantToUse(),
        }

请查看此页面,详细了解如何更改字段验证https://docs.djangoproject.com/en/dev/ref/forms/validation/

这只是一个示意图。

答案 1 :(得分:0)

django-taggit是此用例的完美应用。

像这样定义你的模型:

from taggit.managers import TaggableManager
from taggit.models import TagBase, GenericTaggedItemBase


class Fruit(TagBase):
    class Meta:
        verbose_name = "Fruit"
        verbose_name_plural = "Fruits"

class TaggedFruit(GenericTaggedItemBase):
    tag = models.ForeignKey(Fruit,
                            related_name="%(app_label)s_%(class)s_items")

class Box(models.Model):
    name = models.CharField(max_length=199)
    fruits = TaggableManager(through=TaggedFruit)

然后创建基本模型表单:

class BoxModelForm(ModelForm):
    class Meta:
        model = Box

就是这样!您现在可以在框中添加水果标签,以逗号分隔。如果水果不存在,它将被添加到水果表中。有关如何使用 django-taggit 的详细信息,请阅读docs

您可以将其与基于jquery的Selectize.js一起使用。