我使用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
会被创建吗?
答案 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一起使用。