11

レシピを保存するフォームをまとめました。フォームとインライン フォームセットを使用します。レシピを含むテキスト ファイルを持っているユーザーがいて、データをカット アンド ペーストして簡単に入力できるようにしたいと考えています。生のテキスト入力を処理した後にフォーム部分に入力する方法を考え出しましたが、インライン フォームセットに入力する方法がわかりません。

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で遊んでみましたが、私はそこに少し深みがありません

どんな提案でも大歓迎です。

4

2 に答える 2

23

私の最初の提案は、単純な方法を取ることです: and を保存しRecipeRecipeIngredient結果Recipeをインスタンスとして使用してFormSet. フォームセットがユーザーによって承認されたかどうかを示すために、「レビュー済み」ブールフィールドをレシピに追加することができます。

ただし、何らかの理由でその道をたどりたくない場合は、次のようにフォームセットに入力できるはずです。

テキスト データを解析してレシピの材料にし、次のような辞書のリストがあると仮定します。

recipe_ingredients = [
    {
        'ingredient': 2,
        'quantity': 7,
        'unit': 1
    },
    {
        'ingredient': 3,
        'quantity': 5,
        'unit': 2
    },
]

「成分」および「単位」フィールドの数値は、それぞれの成分および測定単位オブジェクトの主キー値です。テキストをデータベース内の成分に一致させる方法、または新しいものを作成する方法をすでに策定していると思います。

その後、次のことができます。

RecipeFormset = inlineformset_factory(
    Recipe,
    RecipeIngredient,
    extra=len(recipe_ingredients),
    can_delete=False)
formset = RecipeFormset()

for subform, data in zip(formset.forms, recipe_ingredients):
    subform.initial = data

return render_to_response('recipes/form_recipe.html', {
     'form': form,
     'formset': formset,
     })

これにより、フォームセットinitial内の各フォームのプロパティがrecipe_ingredientsリストの辞書に設定されます。フォームセットの表示に関してはうまくいくようですが、まだ保存を試みていません。

于 2010-07-19T11:27:15.337 に答える
1

これで Aram Dulyan コードを動作させることができませんでした

for subform, data in zip(formset.forms, recipe_ingredients):
    subform.initial = data

どうやらdjango 1.8で何かが変更され、cached_propertyを反復できないようです

フォーム - 0x7efda9ef9080 の django.utils.functional.cached_property オブジェクト

このエラーが発生しました

zip 引数 #1 は反復をサポートする必要があります

しかし、私はまだ辞書を取り、それをフォームセットに直接割り当てて、うまくいきました。私はここから例を取りました:

https://docs.djangoproject.com/en/dev/topics/forms/formsets/#understanding-the-managementform

from django.forms import formset_factory from myapp.forms import ArticleForm

ArticleFormSet = formset_factory(ArticleForm, can_order=True)
formset = ArticleFormSet(initial=[
    {'title': 'Article #1', 'pub_date': datetime.date(2008, 5, 10)},
    {'title': 'Article #2', 'pub_date': datetime.date(2008, 5, 11)},
])

フォームセットをテンプレートに割り当てる際の私のコード

return self.render_to_response(
self.get_context_data(form=form, inputvalue_numeric_formset=my_formset(initial=formset_dict)
于 2016-01-30T14:10:20.307 に答える