レシピを保存するフォームをまとめました。フォームとインライン フォームセットを使用します。レシピを含むテキスト ファイルを持っているユーザーがいて、データをカット アンド ペーストして簡単に入力できるようにしたいと考えています。生のテキスト入力を処理した後にフォーム部分に入力する方法を考え出しましたが、インライン フォームセットに入力する方法がわかりません。
http://code.djangoproject.com/ticket/12213で解決策がほぼ説明されているようですが、 それらをまとめることはできません。
私のモデル:
#models.py
from django.db import models
class Ingredient(models.Model):
title = models.CharField(max_length=100, unique=True)
class Meta:
ordering = ['title']
def __unicode__(self):
return self.title
def get_absolute_url(self):
return self.id
class Recipe(models.Model):
title = models.CharField(max_length=255)
description = models.TextField(blank=True)
directions = models.TextField()
class Meta:
ordering = ['title']
def __unicode__(self):
return self.id
def get_absolute_url(self):
return "/recipes/%s/" % self.id
class UnitOfMeasure(models.Model):
title = models.CharField(max_length=10, unique=True)
class Meta:
ordering = ['title']
def __unicode__(self):
return self.title
def get_absolute_url(self):
return self.id
class RecipeIngredient(models.Model):
quantity = models.DecimalField(max_digits=5, decimal_places=3)
unit_of_measure = models.ForeignKey(UnitOfMeasure)
ingredient = models.ForeignKey(Ingredient)
recipe = models.ForeignKey(Recipe)
def __unicode__(self):
return self.id
レシピ フォームは ModelForm を使用して作成されます。
class AddRecipeForm(ModelForm):
class Meta:
model = Recipe
extra = 0
ビュー内の関連コード (フォーム入力を解析するための呼び出しは削除されます):
def raw_text(request):
if request.method == 'POST':
...
form_data = {'title': title,
'description': description,
'directions': directions,
}
form = AddRecipeForm(form_data)
#the count variable represents the number of RecipeIngredients
FormSet = inlineformset_factory(Recipe, RecipeIngredient,
extra=count, can_delete=False)
formset = FormSet()
return render_to_response('recipes/form_recipe.html', {
'form': form,
'formset': formset,
})
else:
pass
return render_to_response('recipes/form_raw_text.html', {})
上記のように FormSet() を空にすると、ページを正常に起動できます。フォームセットに、特定した数量、unit_of_measure、および成分を供給するいくつかの方法を試しました。
- 初期データを設定しますが、インラインフォームセットでは機能しません
- 辞書を渡しますが、管理フォームエラーが発生します
- initで遊んでみましたが、私はそこに少し深みがありません
どんな提案でも大歓迎です。