2016-03-18 4 views
2

Ich habe eine Anwendung namens "Schule" in einem meiner Django-Projekte.Wie kann ich related_name in Django-Modellen korrekt verwenden, um den Klassennamen zurückzuerhalten?

Unten ist der Code von models.py

from django.db import models 

class Student(models.Model): 
    name = models.CharField(max_length=255) 
    birthday = models.DateField(blank=True) 

class Class(models.Model): 
    name = models.CharField(max_length=255) 
    student = models.ForeignKey(Student,related_name='classes',null=True) 

    def __str__(self): 
     return self.name 

Und jetzt views.py:

from django.shortcuts import render 
from .models import * 

def test(request): 
    obj2 = Student.objects.get(name='john') 
    return render(request,'test/list.html', {'obj2':obj2}) 

Und schließlich meine Vorlage sieht wie folgt aus:

{% block content %} 
<h2> 
{{ obj2.classes }} 
</h2> 
{% endblock %} 

In meiner Vorlage verwende ich obj2.classes (d. H. Responseobject.related_name). Ich möchte, dass der Klassenname gedruckt wird. Allerdings, wenn ich die Website unter http://127.0.0.1:8000/shop/ zugreifen, es gibt mir diese Ausgabe:

shop.Class.None 

Wie werde ich die Ausgabe als nur „Klasse“ erhalten, dass der Klassenname ist?

+0

'obj2.classes' wäre ein RelatedManager, der die einzelnen zugehörigen" Klassen "-Instanzen bereitstellen kann. Also in Ihrer Vorlage, sollten Sie es mit etwa wie '{% für cls in obj2.classes.all 5%} {0}} {{cls}} {% endfor%} ' –

+0

@ Håken Lid, ich glaube nicht. In meinem Beispiel enthält obj2 nur eine Instanz, da ich obj2 = Student.objects.get (name = 'john') verwendet habe. –

Antwort

0

Würde obj2._meta.get_field('classes').related_model.__name__ die Arbeit machen? Dies funktioniert nur mit Ihrer Ansicht, nicht mit der Vorlage.

def test(request): 
    obj2 = Student.objects.get(name='john') 
    classes_name = obj2._meta.get_field('classes').related_model.__name__ 
    return render(request, 'test/list.html', 
        {'obj2':obj2, 'classes_name': classes_name}) 

Mit dieser Methode vermeiden Sie obj2.classes, zu verwenden, die die Datenbank mit dem Objekt abzurufen trifft.

Sie können den verbose_name auch mit obj2._meta.get_field('classes').related_model._meta.verbose_name abrufen.

Verwandte Themen