2016-04-08 21 views
0

最近、私はPythonとDjangoを使ってWebサイトを作っています。問題が発生しました。Djangoの外部キーの関係

私はの詳細を表示するためのページを持っている私のサイトでは、それは私の全くの未経験のbecuaseだ、と私はシンプルなものを見落としたりダム何かをやったことをことを、確認することが、まあ...

することができますレシピ(説明、原料、説明書など)。私は、このようなように、これを表示しています:

views.py 
class RecipeView(generic.DetailView): 
    model = recipe 
    template_name = 'whatsfordinner/recipe.html' 
    context_object_name = 'details' 

を私は私の単一インフォ物事を表示することができましたこれまでのところ、何の問題は、({{details.whateverは}})

私の問題は、両方の命令ということではありません材料は私のdbに外来キーの関係で格納されているので、別々に出力する必要があります。

class recipe(models.Model): 
    title = models.CharField(max_length=255) 
    description = models.TextField(default="No decsription added") 
    image = models.ImageField(upload_to='images/', 
             default='images/default.jpg') 
    total_favourites = models.IntegerField() 
    servings = models.IntegerField() 

    def __str__(self): 
     return self.title 

class ingredients(models.Model): 
    recipe = models.ForeignKey(recipe) 
    ingredient = models.CharField(max_length=255) 

私は私の選択されたレシピに関連する成分を出力し、本当に苦労を抱えている、と私はいくつかのポインタを大好きだ:私のデータベースには、このようになります。レシピオブジェクトの場合

+1

出力違ったテストされていない、どのように?あなたが何をしようとしているのか、なぜそれが間違っているのかを正確に示してください –

+1

'recipeobj.ingredients_set。all() ' –

答えて

0

rを言う:

r.ingredients_set.all()はそのレシピにリンクされているすべての成分が一覧表示されます。

あなたは、さらにこの上でフィルタリングすることができます。 r.ingredients_set.filter(title__startswith='clover')

をDjangoのドキュメント内の包括的なガイドがあります: https://docs.djangoproject.com/en/1.9/topics/db/examples/many_to_one/

はあなたのviews.pyでレシピのすべての成分のリストをしたいとします

ingredient_list = r.ingredients_set.all() 

次に、コンテクスト辞書の「原料リスト」をテンプレートに渡します。どのようなコンテキスト辞書がわからない場合、何をやっているのですか?Djangoのドキュメントを読んでください!たくさんの人々が、素敵なドキュメントを作成するために多くの努力をしました。

と入力します。は、テンプレートhtmlに渡すコンテキスト辞書です。context['ingredients'] = ingredient_listと入力します。 次に、あなたのテンプレートで、このような何かのためにDjangoのテンプレート言語を使用します。

{% for i in ingredients %} 
    <p>{{ i.ingredient }}</p> 
{% endfor %} 

ここingredientsあなたはコンテキスト辞書を使用して渡さingredient_listであり、各成分オブジェクトiためのループのために、あなたが値を表示している中<ingredient object i>.ingredient

ここで、公式チュートリアルのリンクが役立ちます。 https://docs.djangoproject.com/en/1.9/intro/tutorial01/

+0

うん、これはmanage.pyシェルでテストしてレシピIDだけをハードコードすると機能する。しかし、私はどのように私は私のview.pyと私のテンプレートにこれを組み込むことができない私は得る何。 –

+1

あなたのテンプレートでは、私のようなfor_product_listの中で私はforループを行います:テンプレートのdjangoチュートリアルを読んでください。 –

0

こちらをご覧ください:https://docs.djangoproject.com/en/1.9/topics/class-based-views/generic-display/#adding-extra-context上記

class PublisherDetail(DetailView): 

    model = Publisher 


class RecipeView(generic.DetailView): 
    model = recipe 
    template_name = 'whatsfordinner/recipe.html' 
    context_object_name = 'details' 

    def get_context_data(self, **kwargs): 
     # Call the base implementation first to get a context 
     context = super(RecipeView, self).get_context_data(**kwargs) 
     # Add in a QuerySet of all the books 
     context['ingredient_list'] = recipe.ingredients_set.all() 
     return context 

+0

これは間違いなくほとんど働いているようです。私が間違って** ingredients.objects.all()**をリンクされたドキュメントに従って置くと、すべての成分が取り除かれました。 ** recipe.ingredients_set.all()**に変更するとエラーになります** ** 'ReverseManyToOneDescriptor'オブジェクトには 'all'という属性はありません** –

関連する問題