七日Python之路--第三天(之初试Django 2-2)

接上文。前面(1)(2)部分已经实现浏览器访问工程项目,并且能后台管理新创建的app。

(二)第一个Django的app



(3)教你开始写Django1.6的第1个app

前面已经完成了model(M)的设置。剩下的只有view(V)和urls(C)了。Django的视图部分,由views.py 和 templates完成。

在polls中,我们将创建4个视图:

“index” 列表页 – 显示最新投票。
“detail” 投票页 – 显示一个投票的问题, 以及用户可用于投票的表单。
“results” 结果页 – 显示一个投票的结果。
投票处理 – 对用户提交一个投票表单后的处理。

现在修改 views.py 创建用于视图的函数。

[email protected]:~/Python/mysite$ vim polls/views.py
from django.shortcuts import render,get_object_or_404

# Create your views here.
from django.http import HttpResponse
from polls.models import Poll

def index(request):
    latest_poll_list = Poll.objects.all().order_by(‘-pub_date‘)[:5]
    context = {‘latest_poll_list‘:latest_poll_list}
    return render(request,‘polls/index.html‘,context)

def detail(request,poll_id):
    poll = get_object_or_404(Poll,pk=poll_id)
    return render(request,‘polls/detail.html‘,{‘poll‘:poll})

def results(request,poll_id):
    return HttpResponse("you‘re looking at the results of poll %s." % poll_id)

def vote(request,poll_id):
    return HttpResponse("you‘re voting on poll %s." % poll_id)

#涉及Django的自带函数,不做深究。后面再做研究!

要想使试图能被访问,还要配置 urls.py 。mysite是整个网站的URLConf,但每个app可以有自己的URLConf,通过include的方式导入到根配置中即可。现在在polls下面新建 urls.py

from django.conf.urls import patterns,url

from polls import views

urlpatterns = patterns(‘‘,
    #ex:/polls/
    url(r‘^$‘,views.index,name=‘index‘),
    #ex:/polls/5/
    url(r‘^(?P<poll_id>\d+)/$‘,views.detail,name=‘detail‘),
    #ex:/polls/5/results/
    url(r‘^(?P<poll_id>\d+)/results/$‘,views.results,name=‘results‘),
    #ex:/polls/5/vote/
    url(r‘^(?P<poll_id>\d+)/vote/$‘,views.vote,name=‘vote‘),
)
#url中,三个参数。正则的url,处理的函数,以及名称
#正则表达式!!!!!

然后在根 urls.py 文件中,include这个文件即可。

[email protected]:~/Python/mysite$ vim mysite/urls.py
from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns(‘‘,
    # Examples:
    # url(r‘^$‘, ‘mysite.views.home‘, name=‘home‘),
    # url(r‘^blog/‘, include(‘blog.urls‘)),

    url(r‘^polls/‘, include(‘polls.urls‘,namespace="polls")),
    url(r‘^admin/‘, include(admin.site.urls)),
)
#有Example:两种形式。因为是元组,所以开始有“ ‘’, ”。

然后开始创建模板文件。在polls下,创建templates文件夹。下面有index.html, detail.html 两个文件。

<!-- index.html -->
{% if latest_poll_list %}
    <ul>
    {% for poll in latest_poll_list %}
        <li><a href="{% url ‘polls:detail‘ poll_id=poll.id %}">{{ poll.question }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

<!--detail.html-->
<h1>{{ poll.question }}</h1>
<ul>
{% for choice in poll.choice_set.all %}
    <li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>

<!-- 视图设置完毕,具体语法还要深入研究! -->
<!-- 现在重启服务, 便可看到相应视图  -->

(4)教你开始写Django1.6的第1个app

上面只是简单的实现了视图功能,并没有真正的实现投票功能。接下来就是完善功能。

#修改模板文件
[email protected]:~/Python/mysite$ vim polls/templates/polls/detail.html
#需要加入form表单
<h1>{{ poll.question }}</h1>
 
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
 
<form action="{% url ‘polls:vote‘ poll.id %}" method="post">
{% csrf_token %}
{% for choice in poll.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>

然后需要修改 views.py 中的 vote 处理函数。进行post数据的接收与处理。

# 文件 polls/views.py

from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse
from polls.models import Choice, Poll
# ...
def vote(request, poll_id):
    p = get_object_or_404(Poll, pk=poll_id)
    try:
        selected_choice = p.choice_set.get(pk=request.POST[‘choice‘])
    except (KeyError, Choice.DoesNotExist):
        # Redisplay the poll voting form.
        return render(request, ‘polls/detail.html‘, {
            ‘poll‘: p,
            ‘error_message‘: "You didn‘t select a choice.",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        # Always return an HttpResponseRedirect after successfully dealing
        # with POST data. This prevents data from being posted twice if a
        # user hits the Back button.
        return HttpResponseRedirect(reverse(‘polls:results‘, args=(p.id,)))

在投票成功之后,让用户浏览器重定向到结果 results.html 页。

def results(request, poll_id):
    poll = get_object_or_404(Poll, pk=poll_id)
    return render(request, ‘polls/results.html‘, {‘poll‘: poll})

然后就需要创建模板 results.html 。

<!-- polls/templates/polls/results.html -->

<h1>{{ poll.question }}</h1>
 
<ul>
{% for choice in poll.choice_set.all %}
    <li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>
 
<a href="{% url ‘polls:detail‘ poll.id %}">Vote again?</a>

至此,重启服务就能看到单选按钮,以及submit了。



but,发现这个竟然是官网上的例子..........................Orz...................



源地址:https://docs.djangoproject.com/en/1.6/ Django1.6 官方文档           看来自己又犯二了......    还是等着明后天的看官方文档吧!!!

--2014.7.23 16:44

七日Python之路--第三天(之初试Django 2-2)

时间: 2024-11-08 19:08:58

七日Python之路--第三天(之初试Django 2-2)的相关文章

七日Python之路--第三天

之前由于看基础看的觉着没意思,才去提前看一下Django的.现在突然不知到该干啥了. 不管什么语言,官方文档是必须的.so........... 莫名浮躁,实在看不下去........   待会研究 re 吧.虽然之前研究过,但许久不使用,忘的差不多了....Orz. --2014.7.23 18:37 正则表达式: 1.掌握正则表达式的规则 正则表达式是一种小型,高度专业化的编程语言,内嵌Python中,通过re模块实现. 正则表达式模式被编译成一系列字节码,由用C编写的匹配引擎执行. 字符匹

七日Python之路--第三天(之不安分 wxPython)

Python有好多个GUI框架,wxPython比较流行,so just do it.....   Win下各种不爽,又换Ubuntu 跟着教程做个记事本.视频地址:http://www.pythoner.cn/course/topic/wxPython-gui/ (一)wxpython的安装 Ubuntu下的安装,还是比较简单的. #使用:apt-cache search wxpython 测试一下,可以看到相关信息 [email protected]:~/Python$ apt-cache 

七日Python之路--第九天(blog与Django)

在做models之前,最好将https://docs.djangoproject.com/en/1.6/  中的the model layer 细读. (一)琐碎 (1)*args和**kwargs.的使用 在Django中经常见到含有这两个参数的函数.*args可代表任意个参数:func(arg, *args)代表这个函数可以有一个或更多个参数.可以理解成一个参数list.**kwargs可以代表任意个K=V形式的参数.大体就是这样. (2)不经意间,被MySQL的编码折磨.Ubuntu下修改

七日Python之路--第十一天

(一)关于模板,Template 可以在项目根目录下的settings.py 配置文件中,声明 import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) TEMPLATE_DIRS = os.path.join(BASE_DIR, 'templates') 这样模板的默认搜索就是在根目录的'templates'文件下进行寻找. 但是,感觉还是不声明,直接使用默认的搜索路径比较好.当不进行声明时,默认搜索路径是相应的app应用目

七日Python之路--无关Python(混人乱语,不看也罢)

2014年08月06日的下午,内心压制不住的狂躁抑或浮躁.莫名的感到很多无形的压力,以至于感觉自己似乎快要死去. 怎么说呢,前些日子情人节.自己鼓足勇气去见了自己内心喜欢的女生,当然她也是知道的.我们大二还是大三认识的,差不多有两年多了吧.大学不在一个学校,还有一个原因就是她那时有男朋友,但跟男朋友的时分时合.自己由于种种原因,跟她联系也不是太多.后来毕业,自己考研失败,当然这其中全是自己的问题,既然自己做出了选择便没有什么谈论后悔的资格.后来知道她考上了研究生.而我则在青岛找了一家小公司做起了

七日Python之路--第十二天(Django Web 开发指南)

<Django Web 开发指南>.貌似使用Django1.0版本,基本内容差不多,细读无妨.地址:http://www.jb51.net/books/76079.html (一)第一部分 入门 (1)内置数字工厂函数 int(12.34)会创建一个新的值为12的整数对象,而float(12)则会返回12.0. (2)其他序列操作符 连接(+),复制(*),以及检查是否是成员(in, not in) '**'.join('**')   或  '***%s***%d' % (str, int)

七日Python之路--第九天

众所周知,代码这东西不是看出来的.程序这东西只哟一个标准. 下面找点开源的东西看看,学习一下大婶们的犀利编码...... 推荐一下: 虽然有点老了:http://www.iteye.com/topic/405150,还有就是GitHub上面搜索一下Django就能出来很多,当然还有OSChina.只是有个问题,就是Django版本不同,具体的内容可能会有些不同,但大概还是相同的.领略即可,然后书写自己的代码. 首要的还是官方文档. 看着还是有些难度的.偶然发现一个不错的Blog:http://w

七日Python之路--第五天(之找点乐子)

(一)一些闲言碎语 刚才在搜索的时候,看到别人说的一句话,大体意思如下:自从学习Python之后,就不想在学习其他语言了,只想抓紧时间写些有用的东西.细想一下,果真如此. 唉,Python魅力如此之大.感觉比Java容易的多,也可能是小众语言,因为足够小才显得足够强大.算了,不愿多想,还是多写些有意思的东西吧,哈哈. (二)一些有趣的代码 (1)一句话文件服务器 [email protected]:~$ python -m SimpleHTTPServer Serving HTTP on 0.0

七日Python之路--第一天

网上的资源师丰富的.但难免有些过时的信息,比如我现在使用的是去年下载的python3.3,而网上多数都是Python2.7. 差别比较大的就是:①读取用户输入raw_input()已经不能使用,只能使用input().②文件读取file()也不能使用了,被替换成了open(). 入门教材算是看的<简明Python教程>:地址 http://sebug.net/paper/python/index.html 一共16个章节,大约两个小时看完.这样算是入门了吧. 由于之前研究Java方向是WEB方