3

Django には比較的新しく、M2M 関係を処理するための標準的な方法をフォームにまとめようとしています。私はすでにモデルとデータベースを二乗しています。

この例では、記事のプロジェクトでアプリを作成し、カテゴリを追加しようとしています。簡単にするために、記事にはタイトル、本文、タイムスタンプ (フォームには含まれません)、およびカテゴリがあります。記事が属することができる 1 つ以上のカテゴリを表すチェックボックスを好みます。

これまでのところ、私は持っています:

models.py

class Category(models.Model):
    category = models.CharField(max_length=100)

    def __unicode__(self):
        return self.category


class Article(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)
    category = models.ManyToManyField(Category)

    def __unicode__(self):
        return self.title

ビュー.py

def article_index(request):
    return render_to_response('article_index.html', {'articles': Article.objects.all()})

def article_detail(request, article_id=1):
    return render_to_response('article_detail.html', {'article': Article.objects.get(id=article_id)} )

def article_create(request):
    if request.method == 'POST': # If the form has been submitted...
        form = ArticleForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            article = Article.objects.create(
                title=form.cleaned_data['title'],
                body=form.cleaned_data['body'],
                category=form.cleaned_data['category']
            )
            return redirect('article_index') # Redirect after POST
    else:
        form = ArticleForm() # An unbound form

    return render(request, 'article_form.html', { 'form': form })

フォーム.py

class ArticleForm(forms.Form):
    title = forms.CharField(required=True)
    body = forms.CharField(required=True, widget=forms.Textarea)
    category = forms.MultipleChoiceField(Category.objects.all(), widget=forms.CheckboxSelectMultiple)

私が現在立ち往生している2つのアイテムは次のとおりです。

1) ビュー 'article_create' で、Article オブジェクトの一部としてカテゴリを作成する方法がわかりません。シェルでは、save() を呼び出して記事を作成し、その後に各カテゴリを追加する必要がありました。ここで同様のことを行う必要がありますか? たとえば、記事を作成してから、各カテゴリを繰り返しますか? サンプルコードは大歓迎です。

2) 「article_edit」はまだコーディングしていませんが、作成と非常によく似ていると想定していますが、以前に選択したカテゴリを現在の提出物と比較するためのロジックを処理する必要があるかどうか、またはどのように処理する必要があるかはわかりません。または、編集中の記事のカテゴリ エントリをすべて削除し、現在の投稿に基づいて再エントリする必要がありますか? それがおそらく最も簡単です。繰り返しますが、これのサンプル コードが役に立ちます。

ありがとう!

4

3 に答える 3

2

categoryモデルの名前を に変更し、それに応じて関連するコードを更新することから始めcategoriesます。単一の名前付けは、継続的な頭痛の種になるでしょう。

その時点で、あなたはかなり近づいています。記事を送信するときの成功ブランチで、カテゴリを別のステートメントとして割り当てます。

article = Article.objects.create(
    title=form.cleaned_data['title'],
    body=form.cleaned_data['body']
)
# note changed plural name on the m2m attr & form field
article.categories.add(*form.cleaned_data['categories'])
# alternately
# for cat in form.cleaned_data['categories']:
#     article.categories.add(cat)
return redirect('article_index') # Redirect after POST

ああ、そして、回避したことを称賛しModelFormます。フォームインスタンスの配管を自分で接続する方がはるかに簡単です。この質問は、ModelForm関与するとはるかに複雑になります。

編集ビューについては、はい、クリアして再追加するのが最も簡単です。より効率的な方法はありますが、実際に問題が発生するまで複雑にする価値はありません。clear のメソッド呼び出しは になりますarticle.categories.clear()。再追加は上記と同じです。

于 2013-08-04T23:10:03.173 に答える
0

たとえば、次のようにすることができます。

  if todo_list_form.is_valid():
                todo_list = todo_list_form.save(commit=False)
                todo_list.save()
                todo_list_form.save_m2m()
于 2014-11-21T03:31:33.157 に答える