2016-04-08 18 views
0

Ich begann vor kurzem mit Python und Django für die Erstellung einer Website zu arbeiten, und ich habe ein Problem, dass ich einfach nicht herausfinden kann.Django Fremdschlüssel Beziehung

können Sie sicher sein, dass es becuase von meiner völligen Unerfahrenheit ist, und dass ich etwas einfach oder getan etwas Dummes zu übersehen, aber naja ..

Auf meiner Seite ich eine Seite, für die Anzeige von Details über ein Rezept (Beschreibung, Zutaten, Anweisungen und so). Ich Anzeigen dieses wie solche:

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

Bisher konnte ich meine einzige Info Dinge angezeigt werden, kein Problem ({{details.whatever}})

Mein Problem ist, dass beide Befehle und Zutaten werden in meiner DB als eine Fremdschlüsselbeziehung gespeichert und müssen als solche anders ausgegeben werden. Meine Datenbank sieht wie folgt aus:

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) 

Ich bin eine wirklich harte Zeit die entsprechenden Zutaten für das ausgewählte Rezept zum Ausgeben haben, und ich würde einige Hinweise lieben.

+1

Output unterschiedlich, wie? Bitte zeigen Sie genau, was Sie versuchen und warum es schief geht. –

+1

'rezeptobj.ingredients_set.all() ' –

Antwort

0

Für ein Rezept-Objekt, sagen r:

r.ingredients_set.all() alle verknüpften Zutaten in diesem Rezept auflistet.

Sie können weiter auf diesem Filter: r.ingredients_set.filter(title__startswith='clover')

Es gibt einen umfassenden Leitfaden in Django Dokumentation: https://docs.djangoproject.com/en/1.9/topics/db/examples/many_to_one/

Angenommen, Sie die Liste aller Zutaten für ein Rezept in Ihrem views.py wollen:

ingredient_list = r.ingredients_set.all() 

Dann übergeben Sie die Zutatliste in Ihrem Kontextwörterbuch zu Ihrer Vorlage. Wenn Sie nicht wissen, was Kontextwörterbuch ist, was machst du Mann, gehen Sie durch die Django-Dokumentation! Viele Leute haben sich sehr viel Mühe gegeben, diese nette Dokumentation zu erstellen.

angenommen context['ingredients'] = ingredient_list, wobei context das Kontextwörterbuch ist, das Sie an Ihre Vorlage html übergeben. Dann in Ihrer Vorlage verwenden Django Template-Sprache für so etwas wie folgt aus:

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

Hier ingredients ist die ingredient_list Sie das Kontext Wörterbuch bestanden mit und für jeden Bestandteil Objekt i in der for-Schleife, die Sie die Anzeige den Wert von <ingredient object i>.ingredient

Hier ist ein Link zum offiziellen Tutorial, wenn es hilft. https://docs.djangoproject.com/en/1.9/intro/tutorial01/

+0

Yup, das funktioniert, wenn ich es in der manage.py-Shell austeste und nur eine Rezept-ID fest codiere. Aber was ich nicht verstehe, wie ich es schaffe, dies in meine view.py und meine Vorlage zu integrieren. –

+1

In Ihrer Vorlage, machen Sie eine for-Schleife wie für i in Zutatenliste: Lesen Sie die Django-Tutorial auf Vorlagen für Beispiele –

0

Siehe hier: 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 

oben ungetestet ist

+0

Das scheint definitiv zu haben .. fast funktioniert. Es hat ALLE Zutaten gezogen, wenn ich versehentlich ** ingredients.objects.all() ** gemäß der verknüpften Dokumentation gesetzt habe. Wenn ich es ändere ** recipe.ingredients_set.all() ** es wirft nur einen Fehler: ** 'ReverseManyToOneDescriptor' Objekt hat kein Attribut 'all' ** –