4

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
4

1 に答える 1

1

excludeフォームからフィールドを m2m し、CharFieldフォーム クラス自体に手動で追加する必要があります。次にオーバーライドして、と__init__でこのフィールドを設定します。では、テキストに対して好きなことを行うことができます。あなたの場合は、コンマで分割し、各値のカテゴリを取得または作成し、親フォームを保存した後、結果を返す前にオブジェクトのフィールドにカテゴリ リストを割り当てることになると思います。クライアント側での入力ミスを避けるために、オートコンプリートを追加することもできます。initialsavesavecleaned_data

于 2012-04-12T03:19:05.307 に答える