我想在Django中使用ModelForms将内容添加到我的数据库,其中包括ManyToManyField。这里是我的模型的相关部分:Django:ManyToManyField,添加对象,如果它不存在
class Category(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
def __unicode__(self):
return self.name
class Recipe(models.Model):
title = models.CharField(max_length=100)
body = models.TextField()
user = models.ForeignKey(User)
image = models.ImageField(upload_to='images/recipethumbs/', null = True, blank=True)
ingredients = models.ManyToManyField(Ingredient, through="IngredientMap")
categories = models.ManyToManyField(Category)
citation = models.CharField(max_length=200)
def __unicode__(self):
默认情况下,ManyToManyFields是通过选择题的选择表示。这允许用户从类别对象中预先存在的字段中选择。我想改变这一点,以便用户可以选择类别,如果他们目前存在,或者添加新的类别,如果他们不存在。看起来,这可以通过将小部件更改为TextInput来完成。
class RecipeForm(ModelForm):
class Meta:
model = Recipe
widgets = {
'categories': TextInput(attrs={'size': 40,}),
'ingredients': Textarea,
}
但是,如果用户输入当前不存在的类别表中的类别,然后Django的抱怨,我需要“输入值列表”。如何将添加到如果它尚不存在的新类别?
我在自定义.save()作为Ilvar解决方案建议:
categories = re.findall(r'\w+[\w\s]+', self.cleaned_data.get('categories')) #returns an array
if commit:
m.save()
# You can only assign m2m if the Recipe object has been saved.
for category in categories:
try:
category_in_db = Category.objects.get(name=category)
except:
category_in_db = None
if category_in_db:
m.categories.add(category_in_db)
else:
m.categories.create(name=category)
return m
在这种情况下,您希望django知道如何处理来自文本输入的数据?您的类别模型有一个必需的描述字段,因此即使使用自定义小部件,此问题实际上也是无法解决的。 – Greg 2012-04-12 00:53:43
我不指望它知道如何处理它。我想告诉它该怎么做,如果我有一些想法... – bento 2012-04-12 01:01:02