2016-04-08 2 views
0

Недавно я начал работать с Python и Django для создания веб-сайта, и у меня возникла проблема, которую я просто не могу понять.Django external key relation

Вы можете быть уверены, что это 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')

Там всеобъемлющее руководство в Джанго документации: https://docs.djangoproject.com/en/1.9/topics/db/examples/many_to_one/

Предположим, что вы хотите, чтобы список всех ингредиентов для рецепта в вашем views.py:

ingredient_list = r.ingredients_set.all() 

Затем перейдите в список ингредиентов в вашем словаре контекста. Если вы не знаете, какой словарь контекста, что вы делаете, переходите к документации Django! Многие люди приложили много усилий для создания этой хорошей документации.

Предположим, context['ingredients'] = ingredient_list, где context - это словарь контекста, который вы передаете в свой шаблон html. Затем в шаблоне, используйте 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

Yup, это работает, если я тестирую его в оболочке manage.py и просто hardcode идентификатор рецепта. Но я не понимаю, как мне удается включить это в мой view.py и мой шаблон. –

+1

В вашем шаблоне сделайте цикл for, как для i в списке ингредиентов: прочитайте учебник 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

Это определенно похоже ... почти сработало. Он вытащил ВСЕ ингредиенты, когда я случайно положил ** components.objects.all() ** согласно связанной документации. Когда я перехожу к нему ** recipe.ingredients_set.all() ** он просто выдает ошибку: ** Объект 'ReverseManyToOneDescriptor' не имеет атрибута 'all' ** –