大圣画廊v0.2(2015.7.17)
0.2版本号加入的功能
- 以tag分类图片
- 美化。添加瀑布流效果
- 添加tag页和单张图片页
- 添加公布图片页
以下是具体解释。
每添加一个功能,都要从模型。模板,视图,路由四个方面一一改动。
模型:添加tag属性
思考了一下依照昨天想的分类方法还是没办法考虑全然。于是决定用tag标签分类法。
首先在models.py中新建一个Tag类,仅仅有一个name属性
class Tag(models.Model):
name=models.CharField(max_length=20,null=False,unique=True,default="")
def __unicode__(self):
return self.name
admin.site.register(Tag)
然后在Photo类中指定多对多属性tags
tags=models.ManyToManyField(Tag,related_name='has_photos',blank=True)
模板:添加tag页,photo页和post页
分别用来展示一个tag包括的全部图片和单个图片。
所以tag的展示应该和首页是几乎相同的、
tag.html
{% extends "base.html" %}
{% block title %}{{tag.name}}{% endblock %}
{% block content %}
<div class="jumbotron">
<h1 align="center">{{tag.name}}</h1>
</div>
<div class="grid-sizer"></div>
{% for photo in tag.has_photos.all %}
<div class="grid-item">
<a href="p/{{photo.id}}/">
<img src="{{photo.url}}">
</a>
<p>{{photo.title}}</p>
<p>{% for tag in photo.tags.all %} <a href='/t/{{tag.id}}/'>{{tag.name}}</a> {% endfor %}</p>
</div>
{% endfor %}
{% endblock %}
在这里在上面设置了一个巨幕来展示tag的名称,以下放上图片。
tag变量由视图传入,然后通过tag.has_photos.all获取该tag全部的图片。
photo.html
{% extends "base.html" %}
{% block title %}{{photo.title}}{% endblock %}
{% block content %}
<div class="jumbotron" align="center">
<h3>{{photo.title}}</h3>
<img src="{{photo.url}}" >
</div>
<div class="grid-sizer"></div>
{% endblock %}
传入photo然后展示,非常easy。
post.html
post页面须要一个表单来公布图片信息
{% extends "base.html" %}
{% block title %}公布新图片{% endblock %}
{% block content %}
<form class="form-horizontal panel container" method="POST" action=".">{% csrf_token %}
<div class="form-group">
<label class="control-label" for="exampleReply">标题(必填。每张图片都必须有名字哦):</label>
<input type='text' name='title' value="" class="form-control" id="exampleReply" placeholder=""></input>
</div>
<div class="form-group">
<label class="control-label" for="exampleReply">链接(不支持直接上传,能够先把图片公布到堆糖等站点再把链接粘贴过来。谢谢合作):</label>
<input type='text' name='url' value="" class="form-control" id="exampleReply" placeholder=""></input>
</div>
<div class="form-group">
<label class="control-label" for="exampleReply">标签(多个可用空格隔开):</label>
<input type='text' name='tags' value="" class="form-control" id="exampleReply" placeholder=""></input>
<label class="control-label" for="exampleReply">最好使用含义明白的名词或形容词。能够指明图片来源和图片类型最好。
已有的便签见下</label>
</div>
<div class="form-group col-md-2">
<input type="hidden" name="next" value="/"/>
<input type="submit" class="btn btn-lg btn-primary" value="公布"/>
</div>
</form>
<ul class="list-group">
{% for tag in tags %}
<li class="list-group-item"><span class="badge">{{tag.}}</span>{{tag.name}}</li>
{% endfor %}
</ul>
{% endblock %}
post传递三个參数。图片title,图片链接url,还有tag,tag以字符串形式传递。在视图文件里进行分割并和图片绑定。
路由:添加tag,photo和post的链接
加了三行而已:
url(r'^post/$',post,name='post_page'),
url(r'^t/(?P<id>\d+)/$',show_by_tag,name='tag_page'),
url(r'^p/(?P<id>\d+)/$',show_photo,name='show_photo_page'),
以id而不是名字的方式在链接中传递信息,事实上是偷个懒,直接依据id获取对象要方便非常多。
视图:添加三个视图
post视图
略微有点复杂,用于展示表单,也用于接收处理数据
def post(request):
if request.method=='POST':
title=request.POST.get('title')
url=request.POST.get('url')
tags=request.POST.get('tags').split()
new_photo=Photo.objects.create(
title=title,
url=url
)
if tags:
for tag in tags:
new_tag,dummy=Tag.objects.get_or_create(name=tag)
new_photo.tags.add(new_tag)#add tag to new_photo
new_photo.save()
return HttpResponseRedirect('/')
else:
tags=Tag.objects.all()
return render_to_response('post.html',RequestContext(request,{'tags':tags}))
当传输方法是POST时,获取post过来的数据,据此创建一个photo对象,然后把标签字符串分割一个分成单个的标签,加到photo的tags属性里面去,然后保存,跳转到首页。
当传输方法是GET时。直接展示表单页面,只是这里我在表单后面展示了全部存在的tag。
tag和photo视图
def show_by_tag(request,id):
tag=Tag.objects.get(pk=id)
return render_to_response('tag.html',RequestContext(request,{'tag':tag}))
def show_photo(request,id):
photo=Photo.objects.get(pk=id)
return render_to_response('photo.html',RequestContext(request,{'photo':photo}))
获取链接中id相应的tag和photo。然后传递參数就能够了
依旧是用pythonanywhere公布的:
大圣画廊
大圣画廊v0.2(2015.7.17)的更多相关文章
- 关于asp.net执行exe程序时权限不够的解决办法(2015.04.17更新)
一,本文背景 长话短说:asp.net项目中需要用到PDF转换成SWF文件,用户上传后自动调用pdf2swf.exe转换. 但有个问题,执行时权限不够,导致一直报错(滚动条一直在往下滚,刷屏中),见下 ...
- 2015.7.17( NOI2015 day1 )
今天早起做了NOI2015网络同步赛.... 最近NOI是越来越向NOIP靠拢了....但是我还是不会做..... 第一题:程序自动分析 先离散化一下..然后最多就剩20w个数 , 不等于就存起来.. ...
- Daily Scrumming* 2015.12.17(Day 9)
一.团队scrum meeting照片 二.成员工作总结 姓名 任务ID 迁入记录 江昊 任务1077 https://github.com/buaaclubs-team/temp-front/com ...
- ButterKnife 8.2.1 大圣归来
零.前言 ButterKnife是一个视图注入的框架,主要帮我们解决无脑的findViewById.设置监听事件等等体力劳动. 一.引入 好消息是ButterKnife终于使用apt生成代码了,首先在 ...
- SQL Server锁定【2015.12.17】
锁定的体系分类 1.表级锁 保证数据在逻辑上的一致性. 包含:行级锁.分页锁.表.数据分页.LOB分页以及索引叶子级锁. 2.闩 保证数据在物理上的一致性,系统采用,比锁少耗资源,对用户不可见. ...
- iOS 学习笔记 五 (2015.03.17)使用storyBoard进行tableview的跳转
方法一: 点击tableviewCell后,按住ctrl键拖拽至想要跳转的新的界面.这样跳转的结果是,点击tableview中的任何一行都会跳转到新的界面.可以通过控制cell的 属性 userInt ...
- ViewPage 大圣归来 原生示例
VP简介 android-support-v4.jar 是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.而ViewPage就是其中之一,利用它,我 ...
- 【.NetRemoting-2】2015.09.17
[Remoting架构] [1]是.NetFramework的一个重要组成 [2]框架的两个重要特性 [A]基本实现[B]可扩展/可定制 [各个组成部分] [1][客户端,客户端应用程序域] [组成] ...
- 2015/9/17 Python基础(13):函数
函数是对程序逻辑进行结构化或过程化的一种编程方法. Python的函数返回值当什么也不返回时,返回了None和大多数语言一样,Python返回一个值或对象.只是在返回容器对象时,看起来像返回多个对象. ...
随机推荐
- 深度介绍Linux内核是如何工作的
本文发表于Linux Format magazine杂志,作者从技术深度上解释了Linux Kernel是如何工作的.相信对Linux开发者来说有不小的帮助. 牛津字典中对"kernel&q ...
- 【Redis】redis+php处理高并发,很好的教程||附上 php的文件锁
链接至:http://blog.csdn.net/nuli888/article/details/51865401 很好的教程,其中redis+php有点小问题. 附上php文件锁: $fp = fo ...
- c# 操作Word总结
在医疗管理系统中为保存患者的体检和治疗记录,方便以后的医生或其他人查看.当把数据保存到数据库中,需要新建很多的字段,而且操作很繁琐,于是想到网页的信息创建到一个word文本中,在显示的时,可以在线打开 ...
- 【转载】Redis在windows下安装过程
一.下载windows版本的Redis 去官网找了很久,发现原来在官网上可以下载的windows版本的,现在官网以及没有下载地址,只能在github上下载,官网只提供linux版本的下载 官网下载地址 ...
- SQL server 2008定期的备份数据库及删除job
在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库.而备份数据库一般又是在凌晨时间基本没有数据库操作的时候进行,所以我们不可能要求管理员 每天守到晚上1点去备份数据库.要实现数据库的 ...
- 微信小程序请求wx.request数据,渲染到页面
先说一下基本使用.官网也有. 比如说你在App.js里面有这些变量.想修改某些值. data: { main_view_bgcolor: "", border: "&qu ...
- s2sh框架整合具体配置-xml方式
s2sh整合之xml方式 说明:本文档所採用的框架版本号为:Struts 2.1.8, Sping2.5.5, Hibernate 3.5.6 1. 须要的jar包: ------------ ...
- C++一次指针问题和解决(char指针乱码)
问题始末 struct NameGroup { char* Name1; char* Name2; }; NameGroup A() { NameGroup result; //From other ...
- SMBUS讀取數據的方法
第一步 将HST_D0寄存器清零 第二部 确定HST_STS (SMB_BASE 00h)寄存器裡面的所有狀態位是清除的(写清零) 第三步 往XMIT_SLVA(SMB_BAS ...
- mysql 主主复制(双主复制)binlog-do-db
[root@DB ~]# grep "binlog-do-db" /etc/my.cnf binlog-do-db = test [root@DB-S ~]# grep " ...