Django学习笔记(一)

 

1.安装Django,网站下载Django,https://www.djangoproject.com/download/,解压到python安装目录,用CMD进入django目录,输入 python setup.py install

2.创建Django本地项目,将C:\Python27\Lib\site-packages\django\bin加入环境变量,新建一个文件夹DjangoDemo(命名可以随便的),CMD进入新建文件夹, 输入

django-admin.py startproject mysite  即新建了一个Django 项目

3.Django文件架构:

setting文件用于项目的参数设置,例如debug,urls用于声明url对应的函数,views用于储存urls中url对应的函数,__init__.py一般为空,不需要修改。

cmd中输入

>python manage.py runserver

运行服务器

4.urls文件说明

from django.conf.urls import patterns, include, url

from django.contrib import admin
#admin.autodiscover()  这句不知道有什么用
import views

urlpatterns = patterns('',

    (r'^$', views.hello), (r'^%', views.hello1), (r'^$', views.hello1 )) #当访问http://127.0.0.1:8000/hello是程序会运行views里面的hello函数,‘hello’是一个正则表达式

一个重点,正则表达式字符串的开头字母“r”。 它告诉Python这是个原始字符串,不需要处理里面的反斜杠(转义字符)。 在普通Python字符串中,反斜杠用于特殊字符的转义。比如n转义成一个换行符。 当你用r把它标示为一个原始字符串后,Python不再视其中的反斜杠为转义字符。也就是说,“n”是两个字符串:“”和“n”。由于反斜杠在Python代码和正则表达式中有冲突,因此建议你在Python定义正则表达式时都使用原始字符串。 从现在开始,本文所有URL模式都用原始字符串

5.views文件说明

from django.http import HttpResponse

def hello(request):
       return HttpResponse("hello world")
def hello1(request):
    return HttpResponse("hello world1")

函数必须有一个参数request,可以通过这个类访问http请求相关的数据,例如参数,路径等

 

6.从url中提取数据

#urls.py中的代码

(r'^num/(\d+)$', printNum),

#views.py中的代码 def printNum(request,num):
    return HttpResponse("hello i am %s"%num)

效果为访问http://127.0.0.1:8000/num/252   会返回hello i am 252

正则表达式中可以通过()来提取数据,(r'^num/(\d+)$', printNum),会提取括号里面的数据作为printNum中的一个参数,所以printNum有两个参数

7.模板

需要在setting.py文件中添加模板路径

 

TEMPLATE_DIRS = (  
    './mysite/t/',
)#.代表manage.py所在的目录

views.py中的代码为:

 

def hello(request):
    return render_to_response('hello.html', {'list1':[1,2,5,4]})

html:

 

<html>
    <body>
        hello world
        {%for i in list1%}
        {{i}}
        {%endfor%}
    </body>
</html>

 

一个网上的html代码demo:

<html>
<head><title>Ordering notice</title></head>

<body>

<h1>Ordering notice</h1>

<p>Dear {{ person_name }},</p>

<p>Thanks for placing an order from {{ company }}. It's scheduled to
ship on {{ ship_date|date:"F j, Y" }}.</p>

<p>Here are the items you've ordered:</p>

<ul>
{% for item in item_list %}
    <li>{{ item }}</li>
{% endfor %}
</ul>

{% if ordered_warranty %}
    <p>Your warranty information will be included in the packaging.</p>
{% else %}
    <p>You didn't order a warranty, so you're on your own when
    the products inevitably stop working.</p>
{% endif %}

<p>Sincerely,<br />{{ company }}</p>

</body>
</html>

 语句要加空格

{% if text == 'prepare_data' %}
 
模板中对字典的访问方法是比较局限的
例如访问字典的name值
python:
person['name']
模版:
person.name
但是如果字典的key是一个变量
python可以这样:
key='name'
person[key]
但是模版是访问不了的
所以就要对数据进行一定的转换
例如
python
names=['zhangsan','lisi']
name_age={'zhangsan':45,'lisi':78,'wangwu':75}
for name in names:
    print name,name_age[name]

模版

#python语句
names=['zhangsan','lisi']
name_age={'zhangsan':45,'lisi':78,'wangwu':75}
persons=[{'name':name,'age':name_age[name]} for name in names]

#模版语句
{% for person in persons %}
<p>{{person.name}}</p>
<p>{{person.agent}}</p>

 

Python 的“真值”

在Python和Django模板系统中,以下这些对象相当于布尔值的False 

  • 空列表([] 空元组(() ) 空字典({} ) 空字符串('' ) 零值(0 ) 特殊对象None 对象False(很明显)

  • 提示:你也可以在自定义的对象里定义他们的布尔值属性(这个是python的高级用法)。

除以上几点以外的所有东西都视为`` True``

 

模板继承

一般网站中的html都有一般分时固定的,例如导航栏,导入相应css,js文件等,django中可以用模板继承来实现

先新建一个基础模板base.html

<html>
    <body>
        hello world
        {%block content%} {%endblock%}
        hello world
        {%block time%} {%endblock%}
    </body>
</html>

再建一个子模板child1.html:

{% extends "base.html"%}
{% block content%}i am content from child1{%endblock%}        
{% block time%}  i am time from child2{%endblock%}
    

views中的函数:

def hello1(request):
    return render_to_response('child1.html' )

这样返回的结果为:

<html><head></head><body>
    hello world
    i am content from child1
    hello world
    i am time from child2
</body></html>

 8.表单

属性/方法说明举例
request.path 除域名以外的请求路径,以正斜杠开头 "/hello/"
request.get_host() 主机名(比如,通常所说的域名) "127.0.0.1:8000" or "www.example.com"
request.get_full_path() 请求路径,可能包含查询字符串 "/hello/?print=true"
request.is_secure() 如果通过HTTPS访问,则此方法返回True, 否则返回False True 或者 False

HTTP_REFERER,进站前链接网页,如果有的话。 (请注意,它是REFERRER的笔误。)

HTTP_USER_AGENT,用户浏览器的user-agent字符串,如果有的话。 例如: "Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17" .

REMOTE_ADDR 客户端IP,如:"12.345.67.89" 。(如果申请是经过代理服务器的话,那么它可能是以逗号分割的多个IP地址,如:"12.345.67.89,23.456.78.90" 。)

除了基本的元数据,HttpRequest对象还有两个属性包含了用户所提交的信息: request.GET 和 request.POST。二者都是类字典对象,可以通过它们来访问GET和POST数据。

 

form类

django中通过request,如request.POST["key1"]获取数据,如果不存在key1这个值,django会跳出异常,所以对于每一个key,都需要这样写:

if "key1" in request.POST:
    key1=request.POST["key1"]

以防止跳出异常,但是如果key非常多的时候,这样就很麻烦,所以django就引入form类

1)创建一个form类,在views.py文件的同级目录下,创建form.py

from django import forms

class demoForm(forms.Form):
    name=forms.CharField()
    age=forms.NumberInput()
    fav=forms.CharField()
  

这里声明了三个字段,可以在每个字段的声明中加入参数, required=False,表示不是必须的,max_length=100,表示最大长度为100,,等等

2.判断form是否合乎规则

form = demoForm(request.POST)
if form.is_valid():
    name=request.POST["name"]

form.is_valid()方法会判断form是否合乎规则,是就返回True

2.自定义校验规则

例如需要指定age的长度要小于3,就需要在demoForm类下加入方法,clean_age(),如果合乎规则,就返回age,否则抛出异常。校验规则的方法必须以clean_开头。(为什么是clean,跟检验有什么关系吗?)

   def clean_age(self):
        age= self.cleaned_data[age]
        agel = len(age.split())
        if agel< 3:
            raise forms.ValidationError("age too old!")
        return age

 

9.会话与认证

cookies

request.COOKIES

response.set_cookie("mycookies", "eeee")

session

request.session["fav_color"] = "blue"   设置SESSION

fav_color = request.session["fav_color"]  获取SESSION

del request.session["fav_color"]   删除SESSION

def setsession(request):
    request.session["name"]="kevin"
    return HttpResponse("done")
def getsession(request):
    name=request.session["name"]
    return HttpResponse(name)

 

10.重定向

from django.http import HttpResponseRedirect

return HttpResponseRedirect("/get_server")

 

11.视图高级用法

from django.conf.urls.defaults import *

urlpatterns = patterns('mysite.views',
    (r'^hello/$', 'hello'),
    (r'^time/$', 'current_datetime'),
    (r'^time/plus/(\d{1,2})/$', 'hours_ahead'),
)

urlpatterns += patterns('weblog.views',
    (r'^tag/(\w+)/$', 'tag'),
)

 

12.静态文件的配置方法,

由于Django每个版本的静态文件配置方法都不同(我也是醉了。。。),所以需要根据项目使用的版本来选择配置方法,详情参考:

http://my.oschina.net/u/877170/blog/293613

 参考资料:http://djangobook.py3k.cn/2.0/chapter05/

 

 

 

 

posted @ 2014-02-20 09:15  Xjng  阅读(1070)  评论(0编辑  收藏  举报