我有一个主页,其中包含图书的图像,这些图书是生成它们的模板{%for%}语句中的href链接。它大致如下:
{% for book in books %}
<a href="/single_book/">
<img src="{{book.image}}">
</a>
我希望一旦图像被点击以重定向到动态生成的页面,该页面使用来自模型的信息来生成内容,例如书名,作者,发布年份和描述。有没有办法使用像“single_book.html”这样的html文件来执行此操作,并且在单击每本书时它会显示唯一的内容?
我查找了一些网址格式,例如:
url(r'^single_book/(\w+)/$', single_book),
但这是否意味着必须为每本书保存每个保存的html文件,因此第一本书是:“single_book / book1.html”,第二本书是“single_book / book2.html”?我想只有一个单独的html模板文件“single_book.html”为每本书做。
如果有办法做到这一点,那么view.py代码等等......?我正在运行Django 1.6和Python 2.7。使用MySQL DB。我刚刚练习使用“manage.py runserver”。
提前谢谢。
答案 0 :(得分:1)
您只需要为特定图书的详细信息创建单个html文件:
book_detail.html
{{book.title}}
{{book.author}}
{{book.description}}
您只需将书籍实例传递给用户请求的模板book_detail.html
:
网址:
url(r'^single_book/(\d+)/$', single_book),
观点:
def single_book(request, pk):
book = Book.objects.get(pk=pk)
ctx = {'book': book}
return render_to_response('book_detail.html', RequestContext(request, ctx))
答案 1 :(得分:1)
是的,这就是模板的使用方式。如果您阅读this link关于Django的基于类的视图(特别是DetailView),您可以大致了解您应该做什么:
# views.py, using the generic CBV DetailView
class SingleBookView(DetailView):
object = Book
singlebook = SingleBookView.as_view()
# url.py change slightly so you can use named urls in templates
url(r'^single_book/(?P<pk>\w+)/$', singlebook, name='singlebook')
然后每本书的模板可以是相同的single_book.html,因为视图会使用您网址中的pk参数自动检测到该书对象
<p>{{ object.title }}</p>
另外,您现在可以使用命名网址:
{% for book in books %}
{# see how your original loop changes with named urls #}
<a href="{% url singlebook book.pk %}">
<img src="{{book.image}}">
</a>