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