django学习笔记(一)视图和url配置

时间:2022-04-18 21:13:51

1.开始一个项目:

进入创建的目录,然后:

django-admin startproject myblog

2.启动开发服务器:

python manage.py runserver

注:默认是8000端口,可以改,比如:

python manage.py runserver 8001

3.一个视图就是Python的一个函数。这个函数第一个参数的类型是HttpRequest;它返回一个HttpResponse实例。为了使一个Python的函数成为一个Django可识别的视图,它一般必须满足这两个条件。

4.python中有datetime模块。

Import datetime

now = datetime.datetime.now()

plus=2

new_time=now+datetime.timedelta(hours=plus)

5.可以用django出错页来帮助调试

 

def current_time(request, offset):
    now = datetime.datetime.now()
    try:
        offset = int(offset)
    except ValueError:
        raise Http404()
    assert False
    new_time = now + datetime.timedelta(hours=offset)
    html = "<html><body>After %s hours,it is %s.</body></html>" % (offset, new_time)
    return HttpResponse(html)

 

这样比用中途print输出变量的调试方法更好一些,因为django出错页显示的信息非常全。

6.

from views import *

这里*的用法是将views里的东西全部导入。

7.url中可以传入一个包含模块名和函数名的字符串,而不是函数对象本身。这样就不必导入相应的视图函数了。Django 会在第一次需要它时根据字符串所描述的视图函数的名字和路径,导入合适的视图函数。

# -*- coding:utf-8 -*-
from django.conf.urls import patterns, url

urlpatterns = patterns('',
                       url(r'^hello$', 'myblog.views.hello'),
                       url(r'^time/plus/(\d{1,2})/$', 'myblog.views.current_time'),
                       )

当使这个技术时,可以采用更简化的方式:提取出一个公共视图前缀放在patterns的第一个参数里:

# -*- coding:utf-8 -*-
from django.conf.urls import patterns, url

urlpatterns = patterns('myblog.views',
                       url(r'^hello$', 'hello'),
                       url(r'^time/plus/(\d{1,2})/$', 'current_time'),
                       )

8.在实践中,如果使用字符串技术,特别是当 URLconf 中没有一个公共前缀时,最终可能混合视图。 然而,仍然可以利用视图前缀的简便方式来减少重复。 只要增加多个 patterns() 对象,这些对象是可相加的。整个框架关注的是存在一个名为 urlpatterns 的模块级别的变量。

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'),
)

9.使用命名的正则表达式组时值是以关键字参数的方式传递给视图函数的。无命名组时值是以位置参数的方式传递给视图函数的。

from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
    (r'^articles/(\d{4})/$', views.year_archive),
    (r'^articles/(\d{4})/(\d{2})/$', views.month_archive),
)

不用命名组,这就相当于这样的函数调用:

month_archive(request, '2006', '03')
from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
    (r'^articles/(?P<year>\d{4})/$', views.year_archive),
    (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', views.month_archive),
)

带了命名组,就相当于这样:

month_archive(request, year='2006', month='03')

  同一url中最好不要混用命名组和非命名组

  • 如果有任何命名的组,Django会忽略非命名组而直接使用命名组。

  • 否则,Django会把所有非命名组以位置参数的形式传递。

  • 在以上的两种情况,Django同时会以关键字参数的方式传递一些额外参数。

10.视图函数可以设置默认的参数值,如果没有从url中传递过来该参数值,就使用默认的参数值:

def my_view(request, template_name='mysite/my_view.html'):
    var = do_something()
    return render_to_response(template_name, {'var': var})

11.URLconf是自顶向下顺序解析的。

12.每个被捕获的参数将被作为纯Python字符串来发送,而不管正则表达式中的格式。 举个例子,在这行URLConf中

(r'^articles/(?P<year>\d{4})/$', views.year_archive),

尽管 \d{4} 将只匹配整数的字符串,但是参数 year 是作为字符串传至 views.year_archive() 的,而不是整型。

所以在视图函数中要注意类型转换,否则会出现TypeError错误。

13. URLconf里面的每一个模式都可以包含第三个数据: 一个关键字参数的字典。如果有字典传参数值,视图函数以字典里的值为准,不会管正则表达式里传来的值。(所以该变量有字典传值的时候就不要在正则表达式里传值了)

例:

# urls.py

from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
    (r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}),
    (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}),
)

# views.py

from django.shortcuts import render_to_response
from mysite.models import MyModel

def foobar_view(request, template_name):
    m_list = MyModel.objects.filter(is_new=True)
    return render_to_response(template_name, {'m_list': m_list})

14.在任何时候,你的URLconf都可以包含其他URLconf模块。 对于根目录是基于一系列URL的站点来说,这是必要的。

urlpatterns = patterns('',
    (r'^weblog/', include('mysite.blog.urls')),
    (r'^photos/', include('mysite.photos.urls')),
    (r'^about/$', 'mysite.views.about'),
)

 例子中的指向 include() 的正则表达式并不包含一个 $ (字符串结尾匹配符),但是包含了一个斜杆。 每当Django遇到 include() 时,它将截断匹配的URL,并把剩余的字符串发往包含的URLconf作进一步处理。

url中正则表达式里的参数值或者字典型参数值会传递给被包含的URLconf中,并且这个被捕获的参数 总是 传递到被包含的URLconf中的 每一 行,不管那些行对应的视图是否需要这些参数。 比如,下面两种写法效果是一样的:

# urls.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^blog/', include('inner'), {'blogid': 3}),
)

# inner.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^archive/$', 'mysite.views.archive'),
    (r'^about/$', 'mysite.views.about'),
    (r'^rss/$', 'mysite.views.rss'),
)
# urls.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^blog/', include('inner')),
)

# inner.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^archive/$', 'mysite.views.archive', {'blogid': 3}),
    (r'^about/$', 'mysite.views.about', {'blogid': 3}),
    (r'^rss/$', 'mysite.views.rss', {'blogid': 3}),
)