这一节来解决一些我自己的需求。
http://jackerb.sinaapp.com/blog/ 这里一下子把所有博文都显示出来了,并且每个博文的全部内容也都显示出来了,这样不符合我们一般见到的样式,所以先修改博文列表显示的时候,要求只显示部分文字,就像摘要是的。如下操作:
修改templates/homepage.html中,如下所求:
{% extends "base.html" %} {% block content %} {% for post in posts %} <h2>{{ post.title }}</h2> <p>{{ post.timestamp|date }}</p> <p>{{ post.body|truncatechars:300 }}</p> {% endfor %} {% endblock %}
这里是增加了truncatechars:300,也就是限制只显示300个字数。
<p>{{ post.body|truncatechars:300 }}</p>
提交修改到SAE上,再刷新页面,查看效果。
2. 每次在打开百度或者其它页面的时候,在选项卡上都会显示人家设定好的文字,比如百度是:百度一下,你就知道。
我就是想要这个效果,其实这个就是.html里那个title设置的文字。修改templates/base.html,如下:
<html> <style type="text/css"> body { color: #efd; background: #453; padding: 0 5em; margin: 0 } h1 { padding: 2em 1em; background: #675 } h2 { color: #bf8; border-top: 1px dotted #fff; margin-top: 2em } p { margin: 1em 0 } </style> <head> <title>全栈之路</title> </head> <body> <h1>全栈之路</h1> {% block content %} {% endblock %} </body> </html>
这样在选项卡上就显示:全栈之路。
3. 之前用过的一个地址:http://jackerb.sinaapp.com/,现在如果再点,就没有用了,会提示不行404错误,这是因为我们的url设置里没有匹配这个的了。现在我们就增加上,让这个地址和http://jackerb.sinaapp.com/blog指向都一个页面。
修改jackerb/urls.py,如下:
from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() urlpatterns = patterns(‘‘, # Examples: # url(r‘^$‘, ‘oncedo.views.home‘, name=‘home‘), # url(r‘^jackerb/‘, include(‘jackerb.foo.urls‘)), # Uncomment the admin/doc line below to enable admin documentation: # url(r‘^admin/doc/‘, include(‘django.contrib.admindocs.urls‘)), # Uncomment the next line to enable the admin: url(r‘^admin/‘, include(admin.site.urls)), url(r‘^blog/‘, include(‘jackerb.blog.urls‘)), url(r‘^$‘, include(‘jackerb.blog.urls‘)), )
最后一行就是新加的内容,提交修改到SAE上,这时候再访问,就可以了。
4. 现在又有一个问题,我们现在已经有了文章列表这个页面,并且可以显示部分文章内容,但是一般情况下,都是点击文章的标题,就可以进入一个显示这个文章的页面。现在我们就来增加这个功能。
(1)先来让标题变成一个超链接,修改templates/homepage.html,如下:
{% extends "base.html" %} {% block content %} {% for post in posts %} <h2><a href="/blog/{{ post.id }}/">{{ post.title }}</a></h2> <p>{{ post.timestamp|date }}</p> <p>{{ post.body|truncatechars:300 }}</p> {% endfor %} {% endblock %}
上面在标题那里增加了<a>标签,并且我们每个文章我们没有设置id,但是其实已经在数据库中自动生成了,可以去数据库查看一下,所以,我们以他们的id的创建不同的链接地址,以区分不同的文章。
现在可以刷新页面,标题已经变成了超链接了,可以点击跳转,但是现在还没有设置跳转到哪,接下来就进行这一步。
(2)现在先设置一个html来显示文章的标题和内容。
在templates下增加文件content.html,并添加如下内容:
{% extends "base.html" %} {% block content %} <h1>{{ article.title }}</h1> <p>{{ article.body }}</p> {% endblock %}
这里的article就是传过来的参数,一会我们会设置,这里暂时不管,就像是上面的那个posts一样,都是我们传过来的参数。
(3)第(2)步中需要一个article的参数,现在我们就来完成这件事。
在blog/views.py中增加如下内容:
from django.template import loader, Context, RequestContext from django.shortcuts import render_to_response, get_object_or_404 from django.http import HttpResponse from jackerb.blog.models import Blog def homepage(request): posts = Blog.objects.all() t = loader.get_template("homepage.html") c = Context({ ‘posts‘: posts }) return HttpResponse(t.render(c)) def content(request, id): article = get_object_or_404(Blog, id=id) return render_to_response(‘content.html‘, locals(), context_instance=RequestContext(request))
我们这里增加了一个content视图函数,生成article来传给content.html,并且这个视图函数有两个参数,其中一个是id,这就是我们第(1)步中使用过的id,根据这个id我们来查找到相应的文章,传递给content.html。
(4)现在视图有了,我们是怎么跳转到这里的呢,这就需要设置urls.py了
修改blog/urls.py,如下:
from django.conf.urls.defaults import * from jackerb.blog.views import homepage, content urlpatterns = patterns(‘‘, url(r‘^$‘, homepage), url(r‘^(?P<id>\d+)/$‘, content), )
这里其实我不太知道是怎么个意思,我是有了需求之后上网找的办法,暂时就这样,现在就实现了我需要的功能。
点击相应文章标题,跳转到这个文章的页面。
5. 但是现在问题又来了,我原本在编辑的时候有换行,但是在显示的时候却都没有换行,所有文字都挤到了一起,现在我们就来解决这个问题。
修改templates/homepage.html
{% extends "base.html" %} {% block content %} {% for post in posts %} <h2><a href="/blog/{{ post.id }}/">{{ post.title }}</a></h2> <p>{{ post.timestamp|date }}</p> <pre>{{ post.body|truncatechars:300 }}</pre> {% endfor %} {% endblock %}
这里就是把原本的<p>标签换成了<pre>标签,来显示原来的格式。现在提交到SAE上,刷新后看效果。
同样的显示文章内容也需要同样的处理,修改templates/content.html,如下:
{% extends "base.html" %} {% block content %} <h1>{{ article.title }}</h1> <pre>{{ article.body }}</pre> {% endblock %}
这里也是把<p>换成了<pre>标签。点击标题,进入文章页面就可以看到效果了。但是现在又出现一个新的问题,换行是可以了,但是只是按照原来的样式换行,原本过长的还是不自动换行,现在就来实现自动换行。
修改templates/content.html
{% extends "base.html" %} {% block content %} <h1>{{ article.title }}</h1> <div><pre>{{ article.body }}</pre></div> {% endblock %}
这里加上了<div>标签,然后再设置一下<div>的属性,修改templates/base.html,如下:
<html> <style type="text/css"> body { color: #efd; background: #453; padding: 0 5em; margin: 0 } h1 { padding: 2em 1em; background: #675 } h2 { color: #bf8; border-top: 1px dotted #fff; margin-top: 2em } p { margin: 1em 0 } div { word-wrap: break-word } </style> <head> <title>全栈之路</title> </head> <body> <h1>全栈之路</h1> {% block content %} {% endblock %} </body> </html>
这里增加了div的属性word-wrap: break-word来自动换行。现在提交修改,刷新页面来查看效果。
原文:http://my.oschina.net/bxxfighting/blog/517528