5

Mam model, który chcę wyświetlić jako widok szczegółów, utworzyłem widok listy zawierający odsyłacz prowadzący do jego szczegółowego widoku. I nie dostać żadnych błędów, ale szablon nie czyni każdy z modeli szczegółowo Link do DetailViewSzablon widoku szczegółów nie wyświetlający danych modelu

<a href="../ancillaries/{{ Ancillary.id }}" > Product </a> 

model

from django.db import models 
from django.core.urlresolvers import reverse 

class Ancillary(models.Model): 
    product_code = models.CharField(max_length=60, null=True) 
    type = models.CharField(max_length=120, null=True) 
    product = models.CharField(max_length=120, null=True) 
    standard = models.CharField(max_length=120, null=True) 
    measurement = models.CharField(max_length=120, null=True) 
    brand = models.CharField(max_length=120, null=True) 

    class Meta: 
      verbose_name_plural = "Ancillaries" 
    def get_absolute_url(self): 
      return reverse('ancillaries') 
    def __unicode__(self): 
      return u'%s %s %s %s %s %s %s' % (self.id, self.product_code, self.type, 
           self.product, self.standard, 
           self.measurement, self.brand) 

Zobacz

class AncillaryDetail(DetailView): 
    model = Ancillary 
    def get_context_data(self, **kwargs): 

     context = super(AncillaryDetail, self).get_context_data(**kwargs) 

     context['ancillary_list'] = Ancillary.objects.all() 
     return context 

Urls

url(r'^ancillaries/(?P<pk>\d+)/', AncillaryDetail.as_view(template_name='ancillary-detail.html')), 

Szablon

{% for ancillary_list in object_list %} 
{{ Ancillary.product}} 
{{ Ancillary.type }} 
{{ Ancillary.brand }} 
{{ Ancillary.measurement }} 
{% endfor %} 
+0

Powyższy szablon wygląda jak widok listy. Jakiego szablonu używasz do widoku szczegółów i dlaczego dodajesz wszystkie swoje obiekty do kontekstu szczegółowego? – AndrewS

+0

O nie, powyższy szablon jest tym, co użyłem w widoku szczegółów. Nie wiedziałem, jakiego szablonu użyć do wyświetlania danych widoku szczegółów. – vvdect

Odpowiedz

12

Wygląda to tak, jakby użyłeś documentation, ale niepoprawnie zaadaptował przykład ListView. Jeśli chcesz wyświetlić pojedynczą instancję modelu, poprawny widok to DetailView.

As @mrkre zasugerował, że powinieneś nazwać swój wzorzec adresu URL (chociaż do nazwy użyłbym formy w liczbie pojedynczej).

url(r'^ancillaries/(?P<pk>\d+)/', AncillaryDetail.as_view(
       template_name='ancillary-detail.html'), name="ancillary_detail") 

Widok jest po prostu

class AncillaryDetail(DetailView): 
    model = Ancillary 

W szablonie ancillary-detail.html uzyskać dostęp do instancji modelu przy użyciu domyślnej nazwy object.

{{ object.product}} 
{{ object.type }} 
{{ object.brand }} 
{{ object.measurement }} 
+0

Zobacz komentarz Berislava Lopaca w odpowiedzi, poniżej, uważam, że odnosi się również do tej odpowiedzi.\t "Chciałbym tylko dodać, że powinieneś unikać umieszczania template_name w URLconf - raczej umieścić go w definicji AncillaryDetail, tuż pod atrybutem modelu." – IonicBurger

4

Spróbuj:

{% for ancillary in ancillary_list %} 
    {{ ancillary.product}} 
    {{ ancillary.type }} 
    {{ ancillary.brand }} 
    {{ ancillary.measurement }} 
{% endfor %} 

Sugerowałbym użyciu nazw URL:

url(r'^ancillaries/(?P<pk>\d+)/', AncillaryDetail.as_view(), name="ancillary_details") 

<a href="{% url 'ancillary_details' pk=ancillary.pk %}"> 

Place to tuż po DetailView

template_name='ancillary-detail.html' 
+4

Dodałbym tylko, że powinieneś unikać umieszczania 'template_name' w URLconf - raczej umieszczaj go w definicji' AncillaryDetail', tuż pod atrybutem 'model'. –

+0

Zgadzam się, to też robię. Edytowana odpowiedź. – mrkre

+0

@BerislavLopac - czy to nie pozwala na większą kontrolę nad adresem/szablonem w podobny sposób, jak robi to Flask? Innymi słowy, pozwalając na mapowanie jeden do jednego? – IonicBurger

Powiązane problemy