2016-04-08 149 views
0

我最近开始使用Python和Django来制作一个网站,并且遇到了一个我无法弄清楚的问题。Django外键关系

你可以肯定,它的监守我全然缺乏经验,而且我已经忽略了一些简单的或做了一些愚蠢的,但哦..

在我的网站我有一个页面,了解详细信息显示配方(描述,配料,说明等)。我显示此像这样:

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。所有()' –

回答

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() 

然后将您的上下文字典中的ingredient_list传递给您的模板。如果你不知道什么是上下文字典,你在做什么,请通过Django文档!罗德的人们付出了很多努力来创造出那么好的文档。

假设context['ingredients'] = ingredient_list,其中context是您传递给模板html的上下文字典。 然后在你的模板,使用Django模板语言这样的事情:

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

这里ingredients是你使用的语境词典通过ingredient_list,并在for循环中各成分的对象i,正在显示的值<ingredient object i>.ingredient

这是官方教程的链接,如果有帮助的话。 https://docs.djangoproject.com/en/1.9/intro/tutorial01/

+0

是的,这工作,如果我在manage.py外壳测试它,只是硬编码配方ID。但是,我没有得到我如何设法将其纳入我的view.py和我的模板。 –

+1

在你的模板中,为ingredient_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'对象没有属性'全部'** –