实战Django:网络相册Part2

在Part1中我们完成了框架搭建等一系列的准备工作,舍得前面讲过Django的几个要素:模型、视图、模板、链接,现在我们仅仅完成了模型部分的工作。

10.添加内容



在讲其它内容之前,让我们先往items应用里添加些内容。

在上一步打开的页面中点击Items后面的”增加“按钮:

做过前面两个实例的童鞋,相信对这样的表单已经很熟悉了。一个item好比一个帖子,它可以配上多幅图片,我们这里默认设置的是3张图片。要添加更多的图片,可以点击下方的”添加另一个Photo”链接。

我们依次在Name、Description、Title、Caption的文本框中输入文字,点击Image下的”浏览“按钮,然后在弹出的窗口中选择一张图片,点击“打开”按钮返回到页面。

操作完成后,点击“保存”按钮。你可以重复执行同样的操作,多建几个item。

11.编写视图



编辑items/views.py 文件,添加下面的内容:

items/views.py

from django.views import generic
from items.models import Item, Photo

class IndexView(generic.ListView):
    template_name = ‘items/index.html‘
    def get_queryset(self):
        return Item.objects.all()[:5]

class ListView(generic.ListView):
    model = Item
    template_name = ‘items/items_list.html‘

class ItemDetailView(generic.DetailView):
    model = Item
    template_name = ‘items/items_detail.html‘

class PhotoDetailView(generic.DetailView):
    model = Photo
    template_name = ‘items/photos_detail.html‘

对比起我们官方实例中的视图,这个视图显然简单多了:

每个视图拥有同样的模式,都是先指定模型,然后指定模板名称,至于数据,只要告诉视图你用哪个模型,数据会自动取出来。

我们总共有四个视图,共使用了Django通用视图中的两大类型:ListView和DetailView。

各个视图的功能如下:

视图1:首页;

视图2:图片列表页;

视图3:Item内容页;

视图4:照片内容页;

12.编写模板



根据上面的这些视图,我们来一一编写模板。虽然这里有4个模板,但我们希望它们使用统一的风格,所以,先做一个base.html,在这基础上进行扩展,可以让我们的代码更精简。

首先创建模板文件夹,在items文件夹下建立templates文件夹,然后在templates下再建一个items文件夹。

随后我们在这个文件夹下建立base.html文件,这个base.html文件的正确路径应该是:

items/templates/items/base.html

其它的模板也会放在同一个文件夹下.

编辑base.html文件,加入如下内容:

items/templates/items/base.html:

<html>
    <head>
        <title>网络相册 - {% block title %}{% endblock %}</title>
        <style type="text/css">
            body { margin: 30px; font-family: Microsoft Yahei,sans-serif; background: #fff; }
            h1 { background: #6E94A3; padding: 20px; color:#fefefe; }
            h2 { background: #ddf; padding: 10px 20px; }
            h3 { background: #D7E8F0; padding: 5px 20px; }
            p { padding: 5px 20px; }
            table { width: 100%; }
            table th { text-align: left; }
        </style>
    </head>
    <body>
        <h1>网络相册</h1>
        {% block content %}{% endblock %}
    </body>
</html>

在这个base.html模板中,我们定义了两个可继承的块,分别是{% block title %}和{% block content %}。

接下来创建index.html模板,并加入如下代码:

items/templates/items/index.html:

{% extends "items/base.html" %}

{% block title %}首页{% endblock %}

{% block content %}

<p>欢迎使用网络相册,在这里你可以看到一幅幅不同的图片,点击下方的“查看所有图片”链接可以看到所有的图片.</p>

<h3>陈列柜</h3>
<table>
    <tr>
    {% for item in object_list %}
        <td>
            <a href="{{ item.get_absolute_url }}"><b>{{ item.name }}</b><br />
            {% if item.photo_set.count %}
                <img src="{{ item.photo_set.all.0.image.thumb_url }}" />

            {% else %}
                <span>No photos (yet)</span>
            {% endif %}
            </a>
        </td>
    {% endfor %}
    </tr>
</table>
<p><a href="{% url ‘item_list‘  %}">查看相册列表 &raquo;</a></p>
{% endblock %}

然后创建items_list.html模板,加入如下代码:

items/templates/items/items_list.html:

{% extends "items/base.html" %}

{% block title %}相册列表{% endblock %}

{% block content %}

<p><a href="{% url ‘index‘ %}">&laquo; 返回首页</a></p>

<h2>相册列表</h2>
{% if object_list %}
<table>
    <tr>
        <th>标题</th>
        <th>缩略图</th>
        <th>描述</th>
    </tr>
    {% for item in object_list %}
    <tr>
        <td><i>{{ item.name }}</i></td>
        <td>
            {% if item.photo_set.count %}
            <a href="{{ item.get_absolute_url }}">
                <img src="{{ item.photo_set.all.0.image.thumb_url }}" />
            </a>
            {% else %}
            (No photos currently uploaded)
            {% endif %}
        </td>
        <td>{{ item.description }}</td>
    </tr>
    {% endfor %}
</table>
{% else %}
<p>There are currently no items to display.</p>
{% endif %}

{% endblock %}

然后创建items_detail.html,加入如下代码:

items/templates/items/items_detail.html:

{% extends "items/base.html" %}

{% block title %}{{ object.name }}{% endblock %}

{% block content %}

<p><a href="{% url ‘item_list‘ %}">&laquo; 返回相册列表</a></p>

<h2>{{ object.name }}</h2>
<p>{{ object.description }}</p>

<h3>Photos</h3>
<table>
    <tr>
        <th>标题</th>
        <th>缩略图</th>
        <th>说明</th>
    </tr>
    {% for photo in object.photo_set.all %}
    <tr>
        <td><i>{{ photo.title }}</i></td>
        <td>
            <a href="{{ photo.get_absolute_url }}">
                <img src="{{ photo.image.thumb_url }}" />
            </a>
        </td>
        <td>{{ photo.caption }}</td>
    </tr>
    {% endfor %}
</table>

{% endblock %}

最后创建photos_detail.html,加入如下代码:

items/templates/items/photos_detail.html:

{% extends "items/base.html" %}

{% block title %}{{ object.item.name }} - {{ object.title }}{% endblock %}

{% block content %}
<a href="{{ object.item.get_absolute_url }}">&laquo; 返回到 {{ object.item.name }} 内容页</a>

<h2>{{ object.item.name }} - {{ object.title }}</h2>
<img src="{{ object.image.url}}" />
{% if object.caption %}<p>{{ object.caption }}</p>{% endif %}

{% endblock %}

别忘了把所有的模板都储存为UTF-8编码。

13.创建URL模式



在itmes文件夹下创建一个叫url.py的文件,然后添加如下内容:

items/urls.py

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

urlpatterns = patterns(‘‘,
    url(r‘^$‘, views.IndexView.as_view(), name=‘index‘),
    url(r‘^list/$‘, views.ListView.as_view(), name=‘item_list‘),
    url(r‘^(?P<pk>\d+)/$‘, views.ItemDetailView.as_view(), name=‘item_detail‘),
    url(r‘^photo/(?P<pk>\d+)/$‘, views.PhotoDetailView.as_view(), name=‘photo_detail‘),
    )

编辑gallery/urls.py 文件,让它变成下面这样:

gallery/urls.py

from django.conf.urls import patterns, include, url
from django.contrib import admin
from gallery import settings

urlpatterns = patterns(‘‘,
    url(r‘^admin/‘, include(admin.site.urls)),
    url(r‘^media/(?P<path>.*)$‘, ‘django.views.static.serve‘, {‘document_root‘:settings.MEDIA_ROOT}),
    url(r‘^items/‘, include(‘items.urls‘)),
)

第6行非常重要,我们用它来让meida文件夹下的图片文件得以显示。但这种做法仅限于我们调试过程使用,在生产中并不推荐这样操作,应该使用专业的Web服务,如Apache或Nginx来进行这些静态文件的处理。具体的处理方法,可以参考官网的文章:https://docs.djangoproject.com/en/dev/howto/static-files/deployment/

来看一下我们的劳动成果吧,首先是首页,访问http://127.0.0.1:8000/items/

首页的陈列柜中我们显示了一排相册,我们在首页视图中将输出数量设置为5.这仅仅是最简单的做法,你可以自己尝试去修改出不同的效果。

注意观察我们在模板中使用了item.get_absolute_url来获取相册的链接,用 {% url ‘item_list‘  %}来获取相册列表的链接,以及用image.thumb_url来获取每一个相册的第一幅照片的缩略图——这是应用程序很多可扩展的地方之一。

下面的相册列表所用的手法和首页基本相同,只不过这里我们取了所有的相册数据,分三列显示了相册的内容。以后相册数量增加到一定程度的时候,我们还可以考虑加入分页的方法。

相册的内容页和相册列表看上去相差不多,区别在于它会列出这个相册的所有照片,而不仅仅是第一幅照片。

最后就是照片的内容页,在这里你可以看到原始照片,而不再是缩略图。

附:本实例源代码,下载地址:舍得学苑下载中心

【The End】

本文版权归舍得学苑所有,欢迎转载,转载请注明作者和出处。谢谢!

作者:舍得

首发:舍得学苑@博客园

时间: 2024-10-06 11:17:53

实战Django:网络相册Part2的相关文章

实战Django:简易博客Part2

在Part1中,我们完成了本项目的基本框架搭建,并完善了一下管理后台,现在我们来看如何设计面向公共的页面部分. 8.创建模板 首先,请在blog文件夹下建立templates文件夹,然后,在templates文件夹中建立一个叫bog的文件夹,在这个bog文件夹下新建一个archive.html文件,这个文件的路径应该是: bog/templates/bog/archive.html 把下面这些代码添加到archive.html中: bog/templates/bog/archive.html:

实战Django:小型CMS Part2

回顾一下我们之前讲过的几个实例的流程,现在,我们只要添加一些内容(用来测试),创建视图.模板和URL模式,就能完成这个小型的CMS了.   7.添加内容 我们先来创建一个分类,点击Categories后面的"增加"按钮,然后在Label文本框中输入:"Django",在slug文本框后面输入"django"(django不用输入也能自动出现,你可以改成自己喜欢的名字): 随后点击后面的"保存"按钮. 点击左上方的"首

实战Django:网络相册Part1

这个实例与上个实例一样,源自<Django Web开发指南>,舍得根据Django 1.7.1的特性进行了重新编写. <Django Web开发指南>中所用的Django是1.0版,和现在的最新版本相比,有很大差异,比如通用视图.URL.静态文件的处理等等.最初做这本书的实例时,这些变化曾给舍得带来很大的困扰,还好,实例做得多了,慢慢掌握了一些规律,最终把这些实例修改成在Django 1.7.1下可以运行的版本.   1.创建项目和应用 我们先来创建本实例的项目,在dos命令提示符

实战Django:简易博客Part1

舍得学习新技能的时候,通常不喜欢傻读书--捧着一本阐述该项技能的书籍,然后傻看,一路看下来,脑子里塞满了新的概念.知识点,头是越来越大,但技能却几乎没掌握半分. 多年来,舍得养成了用做实例来学习新技能的习惯.这可不是舍得的独创,在象棋.围棋界中,历来有"打谱"一说,就是根据棋谱,把一步步棋摆出来,在打谱的过程中,去感悟.去吸收,此时感悟到的.吸收进的,才是属于你自己的东西.新的技能就这样一步步发展起来,逐渐壮大. 就象Django官方文档那样,一个实例看起来很简单,但作为初学者,用&q

实战Django:官方实例Part1

[写在前面] 撰写这个实战系列的Django文章,是很久之前就有的想法,问题是手头实例太少,一旦开讲,恐有"无米下锅"之忧. 随着对Django学习的深入,渐渐有了些心得,把这些心得整理出来,以规范的.方便新人上手的撰写方式来写这个实战系列,相信对刚接触Django的童鞋会有一定的帮助. 舍得这里所用到的版本,为Django 1.7.1,Python 3.2,想要按照舍得讲解的实例上手练习的话,请务必与舍得所用的版本保持一致. 实例是在Windows系统下调试的,如果你采用的是非Win

实战Django:小型CMS Part1

CMS,即Content Management System,内容管理系统.我们这里要开发的小型CMS应用,从结构上和blog应用有些类似,但我们会在这里加入一些新的技术,比如说工作流.搜索功能.编辑组件等. 1.创建项目和应用 我们先来创建本实例的项目,在dos命令提示符下转到Scripts文件夹(如"c:\python32\Scripts"),然后运行如下命令: $ django-admin startproject cmsproject 然后在dos命令提示符下继续输入如下命令,

实战Django:Pastebin

  这是<Django Web开发指南>中的最后一个实例.如果说上一个实例Liveblog重点讲的是Django和Ajax的协作,那么我们在Pastebin中,将学习到Django和高亮语法JS的协作,顺便复习一下在Django中加入表单. 1.创建项目和应用 我们先来创建本实例的项目,在dos命令提示符下转到Scripts文件夹(如"c:\python32\Scripts"),然后运行如下命令: $ django-admin startproject pastebinpr

实战Django:Rango Part1

在前面我们已经陆续学习了六个Django的实例,其中一个来自Django官方的文档,另外五个来自<Django Web开发指南>.舍得介绍的每一个实例,都是按照官方文档的标准,力求让大家在根据文章去做自己的实例时,能够按"文"索骥,轻松再现整个实例的制作过程. 接下来,舍得要介绍一个大型的实例,这个项目叫做Rango,它来自Django圈内口碑甚佳的<How to Tango with Django>一书.事实上,此书就是围绕Rango这一个实例来展开的,而且,

实战Django:Rango Part6

24.优化模板 在这个项目中,从已经做过的模板来看,你可能会注意到里面有很多重复的代码.这种重复不仅带来大量无谓的工作量,而且以后调整起来也极为不便. 因此,最理想的做法是将那些重复的代码放到基础模板中,然后从基础模板再扩展出一个个新的模板. 我们先来做这个基础模板,在templates/rango文件夹下新建一个base.html文件,然后添加以下内容: templates/rango/base.html: <!DOCTYPE html> <html> <head>

实战Django:LiveBlog

<Django Web开发指南>的实例讲的差不多了,除了今天要介绍的LiveBlog,还有一个Pastebin.这样,书中的实例基本讲完了.做完这些实例之后,舍得建议回头看看这本书,或许你会从书中找到舍得所讲的实例里忽略掉的一些细节.此外,<Django Web开发指南>中有几个章节是关于Django的基础或高级技术的,建议阅读并设法把它应用到你所练习过的实例中. 正如你已经看到的,Django提供了丰富的内置功能,你可以很轻松地用这些功能来完成很多工作.但和所有的工具一样,Dja