[python]Django学习笔记(基础)

一、win7下,没法使用 django-admin.py startproject mysite创建工程。html

这是django的一个bug,网上说能够经过修改注册表解决,但尝试后不行。最后可以使用python c:django-1.5.8/django/bin/django-admin.py startproject mysite成功创建了工程。python

 

二、修改环境变量后没法直接使用django-admin.py。mysql

修改环境变量后,须要重启电脑才能生效。web

 

三、视图与URL配置相关(通常内容参见第三章内容)正则表达式

(1)在views.py中新建一个视图。视图其实就是一个py函数,一个函数对应一个request,返回一个response。sql

(2)注意:views.py是创建在第二层项目文件夹中,跟url.py在同一层,而不是跟manage.py在同一层。shell

(3)在urls.py中添加映射数据库

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

urlpatterns = patterns('',
    ('^hello/$', hello),
)

文件夹中的views.py对应成工程mysite的一个模块,函数hello()从对应的模块导入django

(4)映射经过正则表达式匹配,通常须要匹配开头与结尾。服务器

(5)最后,凡是本站域名128.0.0.1:8000/hello/的都映射到hello函数进行response。(正则表达式规定了url以hello/开头和结尾)

 

四、django模板相关

(1)模板中{{ }}表明变量;

 {% %}为模板标签,用于通知模板完成某种工做;有if标签、for标签等,用法与C语言的差很少;

 

(2)使用模板出错:没法使用t = template.Template('My name is {{ name }}.')

解决:先导入from django.conf import settings,再运行settings.configure()

缘由:

   转到project目录(在第二章由 django-admin.py startproject 命令建立), 输入命令 python manage.py shell启动交互界面。

  若是你曾经使用过Python,你必定好奇,为何咱们运行 python manage.py shell 而不是 python 。这两个命令都会启动交互解释器,可是 manage.py shell 命令有一个重要的不一样: 在启动解释器以前,它告诉Django使用哪一个设置文件。 Django框架的大部分子系统,包括模板系统,都依赖于配置文件;若是Django不知道使用哪一个配置文件,这些系统将不能工做。
  若是你想知道,这里将向你解释它背后是如何工做的。 Django搜索DJANGO_SETTINGS_MODULE环境变量,它被设置在settings.py中。例如,假设mysite在你的Python搜索路径中,那么DJANGO_SETTINGS_MODULE应该被设置为:’mysite.settings’。
  当你运行命令:python manage.py shell,它将自动帮你处理DJANGO_SETTINGS_MODULE。 在当前的这些示例中,咱们鼓励你使用`` python manage.py shell``这个方法,这样能够免去你大费周章地去配置那些你不熟悉的环境变量。
 

(3)定义一个context,用于与模板的标签映射

>>> t = template.Template('My name is {{ name }}.')
>>> c = template.Context({'name': 'Adrian'})
>>> print t.render(c)
My name is Adrian.

能够在template里面直接调用类的属性,而后在context中映射类对象便可(使用字典的键与值也同样),如

>>> d = datetime.date(1993, 5, 2)
>>> d.year
1993
>>> d.month
5
>>> d.day
2
>>> t = Template('The month is {{ date.month }} and the year is {{ date.year }}.')
>>> c = Context({'date': d})
>>> t.render(c)
u'The month is 5 and the year is 1993.'

也能够调用该类的方法,但注意,只能调用没有参数的方法,调用时使用.method的形式,不用添加括号。

使用列表做为tab也能够,使用list.2的方式调用,表示调用列表第二个项

 

五、标签相关

(1)标签中的if语句,else可选,并可使用逻辑判断(PS:同一标签不能同时出现and 和 or)

{% if today_is_weekend and today_is_sunday %}
    <p>Welcome to the weekend!</p>
{% else %}
    <p>Get back to work.</p>
{% endif %}

(2)for标签

{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}

in后必须是可迭代对象。可在最后加上reversed反向遍历;for能够嵌套;

for还有一个可选的empty分句,能够在对象为空时显示,以下

{% for athlete in athlete_list %}
    <p>{{ athlete.name }}</p>
{% empty %}
    <p>There are no athletes. Only computer programmers.</p>
{% endfor %}

每一个for循环中有个forloop.counter(或forcounter0,从0开始计数),从1开始计数,记录循环进行到第几回;还有一个forloop.revcounter,开始时为序列总数,每次递减;forloop.first是一个布尔值,第一次迭代时为真;forloop.last最后一次迭代时为真。forloop.paraentloop是嵌套的上个for的forloop的引用。

{% for item in todo_list %}
    <p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}

(3)比较是否相等

{% ifequal user currentuser %}
    <h1>Welcome!</h1>
{% endifequal %}

也能够添加else分句;

 

六、多行注释

{% comment %}
This is a
multi-line comment.
{% endcomment %}

 

七、过滤器

过滤器使用管道符号|来链接,被处理的对象放在最前,后面能够一次添加管道;有的管道会包含参数,参数使用双引号“”包围;

 

八、模板使用

为了把网页设计模板与python代码分离,可在项目文件夹下新建templates文件夹,并使用get_template来加载模板,必须在settings.py中添加TEMPLATE_DIRS指定模板目录

TEMPLATE_DIRS=( 'E:/djangodev/mysite/mysite/templates', )

模板的使用以下

from django.template.loader import get_template
from django.template import Context

def current_datetime(request):
    now = datetime.datetime.now()
    t = get_template('current_datetime.html')
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)

更方便的返回一个渲染模板:render_to_response()

from django.shortcuts import render_to_response
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    return render_to_response('current_datetime.html', {'current_date': now})

若是在指定的templates下有子文件夹,则在gettemplates和rendertoresponse时添加相对路径便可,如

t = get_template('apptemplates/current_datetime.html')

 

在模板中添加其余模板的内容(通常是一些经常使用的模板),可使用include

<html>
<body>
{% include "includes/nav.html" %}
<h1>{{ title }}</h1>
</body>
</html>

 

九、模板重载

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <h1>My helpful timestamp site</h1>
    {% block content %}{% endblock %}
    {% block footer %}
    <hr>
    <p>Thanks for visiting my site.</p>
    {% endblock %}
</body>
</html>

使用block标签来表明子模板能够重载的部分,每一个block能够起一个名字

使用extend来继承父模板,子模板只是写出与父模板不一样之处便可

{% extends "base.html" %}

{% block title %}The current time{% endblock %}

{% block content %}
<p>It is now {{ current_date }}.</p>
{% endblock %}

 

你能够根据须要使用任意多的继承次数。 使用继承的一种常见方式是下面的三层法:

 (1)建立  base.html 模板,在其中定义站点的主要外观感觉。 这些都是不常修改甚至从不修改的部分。
(2)为网站的每一个区域建立  base_SECTION.html 模板(例如,  base_photos.html 和  base_forum.html )。这些模板对 base.html 进行拓展,并包含区域特定的风格与设计。
(3)为每种类型的页面建立独立的模板,例如论坛页面或者图片库。 这些模板拓展相应的区域模板。
如下是使用模板继承的一些诀窍:
(1)若是在模板中使用  {% extends %} ,必须保证其为模板中的第一个模板标记。 不然,模板继承将不起做用。
(2)通常来讲,基础模板中的  {% block %}  标签越多越好。 记住,子模板没必要定义父模板中全部的代码块,所以你能够用合理的缺省值对一些代码块进行填充,而后只对子模板所需的代码块进行(重)定义。 俗话说,钩子越多越好。
(3)若是发觉本身在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个  {% block %}  中。
(4)若是你须要访问父模板中的块的内容,使用  {{ block.super }} 这个标签吧,这一个魔法变量将会表现出父模板中的内容。 若是只想在上级代码块基础上添加内容,而不是所有重载,该变量就显得很是有用了。
(5)不容许在同一个模板中定义多个同名的  {% block %}  。 存在这样的限制是由于block 标签的工做方式是双向的。 也就是说,block 标签不只挖了一个要填的坑,也定义了在 模板中这个坑所填充的内容。若是模板中出现了两个相同名称的  {% block %}  标签,父模板将无从得知要使用哪一个块的内容。
(6){% extends %}  对所传入模板名称使用的加载方法和  get_template()  相同。 也就是说,会将模板名称被添加到  TEMPLATE_DIRS  设置以后。
(7)多数状况下,  {% extends %}  的参数应该是字符串,可是若是直到运行时方能肯定父模板名,这个参数也能够是个变量。 这使得你可以实现一些很酷的动态功能。
 
十、链接mysql数据库
(1)安装数据库引擎mysqldb
(2)配置setting.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'iyjhabc',
        'PASSWORD': '',
        'HOST': '', 
        'PORT': '',   
    }
}

(3)在mysite下建立一个app

python manage.py startapp books

(4)在app的models.py下使用函数的形式填写表信息

from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

(5)修改setting.py激活APP

INSTALLED_APPS = (
    # 'django.contrib.auth',
    # 'django.contrib.contenttypes',
    # 'django.contrib.sessions',
    # 'django.contrib.sites',
    'books',//书上此处错误
)

(6)检验模型有效性

python manage.py validate

(7)生成SQL语句。PS:此时并未在数据库使用这些SQL语句

python manage.py sqlall books

(8)把models.py的内容同步到数据库。PS:若是models.py中的表还没有新建,则同步会新建这些表,若是对表进行了修改,则同步不会修改这些表。

python manage.py syncdb

 (9)使用以前已经定义好的 Model的子类Pubilisher来把数据添加到数据库

>>> from books.models import Publisher
>>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue',
...     city='Berkeley', state_province='CA', country='U.S.A.',
...     website='http://www.apress.com/')
>>> p1.save()

注意,只有使用save()的时候才正式将数据写入数据库。

(10)直接使用create()函数就能够一次进行填写数据和写数据库的功能

>>> p1 = Publisher.objects.create(name='Apress',
...     address='2855 Telegraph Avenue',
...     city='Berkeley', state_province='CA', country='U.S.A.',
...     website='http://www.apress.com/')

 

十一、数据库查询等操做

可使用fliter()进行SQL的where操做

>>> Publisher.objects.filter(name='Apress')

也能够传递多个参数给fliter,至关于使用SQL的and

Publisher.objects.filter(country="U.S.A.", state_province="CA")

使用contains进行模糊查询,XX 两个下划线 contains,至关于like

Publisher.objects.filter(name__contains="press")

fliter是获取一个结果集,使用get()获取单个对象,当查询到0个或者多于1个结果是,会抛出异常

Publisher.objects.get(country="U.S.A.")

使用orderby来排序,逆序的话在排序项目前面加“-”

Publisher.objects.order_by("name")
Publisher.objects.order_by("-name")

连锁查询,至关于添加多个条件的SQL语句

Publisher.objects.filter(country="U.S.A.").order_by("-name")

使用python列表分片的形式能够提取结果的部分,以下是提取第一个元素

Publisher.objects.filter(country="U.S.A.")[0]

 

十二、数据库更新

 若是要修改一个数据项,则不使用save(),由于他会更新全部数据项,使用update()

>>> Publisher.objects.filter(id=52).update(name='Apress Publishing')

也能够对包含多个纪录的子集进行更新,返回受影响子集个数

>>> Publisher.objects.all().update(country='USA')
2

输出数据,delete()

 Publisher.objects.filter(country='USA').delete()

 

1三、建立admin站点管理页面

Activating the Admin Interface

The Django admin site is entirely optional, because only certain types of sites need this functionality. That means you’ll need to take a few steps to activate it in your project.

First, make a few changes to your settings file:

  1. Add 'django.contrib.admin' to the INSTALLED_APPS setting. (The order of INSTALLED_APPS doesn’t matter, but we like to keep things alphabetical so it’s easy for a human to read.)
  2. Make sure INSTALLED_APPS contains 'django.contrib.auth''django.contrib.contenttypes','django.contrib.messages' and 'django.contrib.sessions'. The Django admin site requires these three packages. (If you’re following along with our ongoing mysite project, note that we commented out these four INSTALLED_APPS entries in Chapter 5. Uncomment them now.)
  3. Make sure MIDDLEWARE_CLASSES contains 'django.middleware.common.CommonMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.contrib.sessions.middleware.SessionMiddleware' and'django.contrib.auth.middleware.AuthenticationMiddleware'. (Again, if you’re following along, note that we commented them out in Chapter 5, so uncomment them.)

Second, run python manage.py syncdb. This step will install the extra database tables that the admin interface uses. The first time you run syncdb with 'django.contrib.auth' in INSTALLED_APPS, you’ll be asked about creating a superuser. If you don’t do this, you’ll need to run python manage.py createsuperuser separately to create an admin user account; otherwise, you won’t be able to log in to the admin site. (Potential gotcha: thepython manage.py createsuperuser command is only available if 'django.contrib.auth' is in your INSTALLED_APPS.)

Third, add the admin site to your URLconf (in urls.py, remember). By default, the urls.py generated bydjango-admin.py startproject contains commented-out code for the Django admin, and all you have to do is uncomment it. For the record, here are the bits you need to make sure are in there:

# Include these import statements...
from django.contrib import admin
admin.autodiscover()

# And include this URLpattern...
urlpatterns = patterns('',
    # ...
    (r'^admin/', include(admin.site.urls)),
    # ...
)

 

把models放入admin页面管理

在该app books下的admin.py下,注册各个模型

from django.contrib import admin

# Register your models here.
from books.models import Publisher, Author, Book

admin.site.register(Publisher)
admin.site.register(Author)
admin.site.register(Book)

 

 1四、表单

使用表单通常就是使用HttpRequest,分为GET和POST两种方法,原理与以前学过的JAVA差很少,GET使用url的形式提交参数,POST使用tcp的方式经过服务器提交。值得关注的是HttpRequest类有很方法用于获取用户的信息,须要慢慢积累。

处理表单的流程: 页面(urls.py)-> python 方法(处理表单数据) -> response(相应出一个结果页面) 

使用到的页面通常使用模板,并用读取到的输入数据和查询结果填充模板。

 

 在文件夹中新建contact来存放联系相关的页面,此时必须新建一个__init__.py的文件,不然python没法找到contact下面的类。(也能够用startapp命令来完成)

 

 

始终要明白,当经过一系列的数据来建立表单对象,并验证经过的时候,就要使用cleaned_data属性进行‘清理工做’,所谓的清理就是对给定的数据对应到python类型。返回的是一组被清理过的字典类型数据。

>>> boundF.cleaned_data
{'age': 22, 'name': u'BeginMan', 'email': u'xinxinyu2011@163.com'}

 

能够在表单中使用隐藏项,用于记录传递数据:当有数据须要传递给下一页面,可定义隐藏表单项

article_id = forms.CharField(widget=forms.HiddenInput())

而后给这个项赋一个厨师值

edit_form = EditForm(initial={ 'article_id':article_id,})

下个页面就能够用GET读取这个值

 

 1五、把菜单封装成tag,并关联响应函数

tage_pages.py

from django import template
register = template.Library()

@register.inclusion_tag('tags/landing_header.html', takes_context=True)
def landing_header(context, nav):
    return {'nav': nav, 'user': context['request'].user}

把landing_header这个tag与此函数与html文件关联起来

 

使用landing_header这个tag的html页面.html

 {% load tags_pages %} #加载tag所在的py文件
 {% recent_app_menu %} #使用tag,后可加空格带参数

一个tag其实就是翻译成一段带模板的html代码,不必定是一个完成的html页面

相关文章
相关标签/搜索