【问题标题】:Django template won't display my model variantsDjango 模板不会显示我的模型变体
【发布时间】:2013-11-08 21:35:29
【问题描述】:

对不起,我是 Django 和一般编程的新手,但我试图从我的模型中调用变量以显示在特定页面上。我将我的 URL 映射到 example.com/archive/book_slug 并想要标题、作者、ISBN 等详细信息。我使用博客应用程序在管理页面中注册我的模型。

当我转到 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

blog/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),

 )

blog/book_detail.html

{% extends "base.html" %}

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

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

【问题讨论】:

  • base.html的内容是什么?它是否定义了一个名为 headercontent 的块?

标签: django django-models django-templates django-views


【解决方案1】:

试试;

<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)。

【讨论】:

  • 另外,我不确定您为什么要同时检索匹配的 Book_item 的查询集和实例本身。通常你会做一个或另一个。
  • 这两个表达式返回相同的对象并不完全正确-正如您所说,filter 返回一个查询集,而get_object_or_404 返回一个模型实例。如果你试图尊重bookdeets.book_title,你会得到一个例外。
  • @PeterDeGlopper 你说得对,我并不是想说它们是一样的,我的解释有点混乱!
  • 很好用。非常感谢。我还认为 bookdeets 有点重复,所以我删除了它。
【解决方案2】:

尝试使用小写的型号名称。

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

【讨论】:

    猜你喜欢
    • 2017-02-15
    • 1970-01-01
    • 2013-02-17
    • 2014-08-07
    • 2017-09-03
    • 2016-10-15
    • 2016-10-03
    • 2021-08-01
    相关资源
    最近更新 更多