2013-11-08 4 views
1

Извините, что я новичок в Django и программировании вообще, но я пытаюсь вызвать переменные из моей модели, которые будут отображаться на определенной странице. Я сопоставил свои URL-адреса с example.com/archive/book_slug и хотел бы получить детали, такие как название, автор, ISBN или что-то еще. Я использовал приложение для блога, чтобы зарегистрировать свои модели на странице администратора.Шаблон Django не отображает мои варианты моделей

Проблема возникает в моем шаблоне, когда я перехожу к URL-адресу, ничего не отображается. Я хочу, чтобы название книги отображалось в заголовке. Может ли кто-нибудь помочь?

блог/models.py

from django.db import models 

class Book_item(models.Model): 
    book_title = models.CharField(max_length=255, blank=False) 
    book_author = models.CharField(max_length=255) 
    book_publisher = models.CharField(max_length=255, blank=True) 
    book_date_published = models.IntegerField(blank=True) 
    book_isbn = models.IntegerField(blank=True) 
    book_slug = models.SlugField(max_length=255, unique=True, blank=False, 
           primary_key=True) 
    book_body = models.TextField(blank=True) 

def __unicode__(self): 
    return self.book_title 

блог/views.py

from django.shortcuts import render, get_object_or_404 
from blog.models import Book_item 

# view for /achive/; template at archive.html 
def archive_index(request): 
    book_info = Book_item.objects.all() 
    context = {'book_info' : book_info} 
    return render(request, 'blog/archive.html', context) 

# view for /archive/book_title; 404 if no title; template at book_detail.html 
def book_details(request, book_slug): 
    bookdeets = Book_item.objects.filter(book_slug=book_slug) 
    details = get_object_or_404(Book_item, book_slug=book_slug) 
    context = {'details' : details, 'bookdeets' : bookdeets} 
    return render(request, 'blog/book_detail.html', context) 

блог/urls.py

from django.conf.urls import patterns, url 
from blog import views 

urlpatterns = patterns('', 

    # archive index at /archive/     
    url(r'^$', views.archive_index), 

    # book deatils at /archive/book_title 
    url(r'^(?P<book_slug>[\w-]+)/$', views.book_details), 

) 

блог/book_detail.html

{% extends "base.html" %} 

{% block title %}{{Book_item.book_title}}{% endblock %} 

{% block headercontent %} 
<h1>{{Book_item.book_title}}</h1> 
{% endblock %} 
+0

Какое содержимое «base.html»? Определяет ли он блок с названием 'headercontent'? –

ответ

3

Попыться;

<h1>{{details.book_title}}</h1> 

Вы передали детали книги в шаблон через переменную «подробности» в контексте ответа.

Как в стороне, вы также можете удалить линию bookdeets = Book_item.objects.filter(book_slug=book_slug), так как вы уже получаете книгу, которую хотите получить прямо через метод get_object_or_404. Учитывая, что slug уникален, filter просто вернет один набор запросов для элементов, так что это всего лишь два разных способа получить один и тот же объект (кроме get_object_or_404 - это удобный «ярлык», который вернет 404, если ничего не будет найдено).

+2

Кроме того, я не уверен, почему вы получаете как набор запросов для сопоставления 'Book_item', так и самого экземпляра. Обычно вы делаете то или другое. –

+1

Не совсем верно, что два выражения возвращают один и тот же объект - как вы говорите, 'filter' возвращает запрос, а' get_object_or_404' возвращает экземпляр модели. Если вы попытаетесь почтить 'bookdeets.book_title', вы получите исключение. –

+0

@PeterDeGlopper Вы правы, я не пытался сказать, что они были такими же, как таковые, я сделал несколько хэш моего объяснения! –

0

попробуйте использовать вашу модель в нижнем регистре.

<h1>{{ book_item.book_title }}</h1> 
Смежные вопросы