2017-02-09 6 views
0

Ich lerne gerade CBVs und habe es schwer, ein Objekt an eine TemplateView zu übergeben. Das war ziemlich demoralisierend, da ich weiß, dass dies sehr einfach sein sollte.Wie übergebe ich Objekte an eine TemplateView?

Hier ist meine views.py:

from __future__ import absolute_import 
from django.views import generic 
from company_account.models import CompanyProfile 

class CompanyProfileView(generic.TemplateView): 
    template_name = 'accounts/company.html' 

    def get_context_data(self, **kwargs): 
     context = super(CompanyProfileView, self).get_context_data(**kwargs) 
     return CompanyProfile.objects.all() 

Und hier ist mein Models.py:

from __future__ import unicode_literals 

from django.db import models 
from django.contrib.auth.models import User 
from django.core.urlresolvers import reverse 

class CompanyProfile(models.Model): 
    company_name = models.CharField(max_length=255) 

    def __str__(self): 
     return self.company_name 

Hier ist urls.py

urlpatterns = [ 
    url(r'^accounts/companyprofile/$', CompanyProfileView.as_view()), 
] 

Und schließlich ist hier die Vorlage:

{% extends '_layouts/base.html' %} 

{% block title %}Company Profile{% endblock %} 

{% block headline %}<h1>Company Profile</h1>{% endblock %} 

{% block content %}{{ CompanyProfile.company_name }}{% endblock %} 

Was fehlt mir? Vielen Dank im Voraus für Ihre Hilfe.

+0

Es gibt wenige Dinge, die Sie falsch machen, aber um Ihnen zu helfen, müssen wir wissen, was Sie eigentlich erreichen wollen? –

Antwort

1

Die Vorlage kann nicht lesen Sie das Modell CompanyProfile. Sie müssen zuerst eine Instanz des Modells erstellen, bevor Sie ein Attribut erhalten.

Angenommen, Sie mehrere Instanzen von CompanyProfile haben:

CompanyProfile.objects.get (pk = 1) -> dies hat eine company_name = "Adidas" CompanyProfile.objects.get (pk = 2) - -> Das hat eine company_name = "Nike"

Und angenommen, Sie möchten Nike und Adidas anzeigen.

Dann ist hier, wie Sie es tun können:

class CompanyProfile(models.Model): 
    company_name = models.CharField(max_length=25) 

class CompanyProfileView(views.TemplateView): 
    template_name = 'my_template.html' 

    def get_context_data(self, **kwargs): 
     context = super(CompanyProfileView, self).get_context_data(**kwargs) 
     # here's the difference: 
     context['company_profiles'] = CompanyProfile.objects.all() 
     return context 

Dann machen Sie Ihre Vorlage wie folgt aus:

{% for company in company_profiles %} 
    {{ company.company_name }} 
{% endfor %} 

Ich hoffe, das hilft!

+0

Es hat funktioniert! Das war sehr hilfreich. Das Kontext-Bit hat mich verwirrt, aber ich verstehe es jetzt mit Ihrer Hilfe. Vielen Dank. – Dan

+0

Das ist gut zu wissen! :) – irene

Verwandte Themen