Django で ModelForms を使用して、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,
}
しかし、ユーザーが Categories テーブルに現在存在しないカテゴリを入力すると、Django は「値のリストを入力する」必要があると不平を言います。まだ存在しない場合、フォームに新しいカテゴリを追加するにはどうすればよいですか?
Ilvar が提案したカスタム .save() での私の解決策:
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