Django

记录Django框架的学习

Django框架结构图

安装Django

sudo apt-get install python-django -y

Django的简单配置

1.在根目录下创建一个项目:django-admin startproject django1
startproject创建的目录结构如下:

django1/
       manage.py
       django1/
              __init__.py
              settings.py
              urls.py
              wsgi.py

  • 外层django1目录只是项目的一个容器,对于Django来说该目录名并不重要,可以重命名该文件夹
  • manage.py:它是一个实用的命令行工具,使用它可以与该Django项目进行交互,可以在django-admin.py and manage.py中查看manage.py所有细节。
  • 内层django1目录是项目中的实际Python包,该目录名就是Python包名,通过它可以导入里面的任何东西。(例如:import django1.settings)
  • django1/__init__.py:一个空文件,告诉Python该目录是一个Python包
  • django1/setting.py :该Django项目的设置、配置。
  • django1/urls.py:该Django项目的URL声明,一份由Django驱动的网站“目录”
  • django1/wsgi.py:一个WSGI兼容的Web服务器的入口,用于项目的运行

2.进入项目文件夹,创建一个应用:python manage.py startapp one
3.在项目的settings.py文件中添加刚刚建立的应用(为了使用render函数渲染模板,):

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'one',
)      

模板的使用

1.url配置(更改url.py文件):
在url.py的patterns中添加类似

url(r'^one/','one.views.index')    

的语句,引用界面在one文件夹下的views.py中的index视图函数
2.编写views.py文件的index函数,实现加载html文件(第一种写法):

from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader,Context
def index(req):
    test_html = loader.get_template('test.html')#搜索app中templates文件夹下的test.html文件,并生成模板对象
    text = Context({})#生成模板参数对象
    return HttpResponse(test_html.render(text))#模板对象通过render方法加入模板参数用HttpResponse返回浏览器  

加载html文件(第二种写法):

from django.shortcuts import render,render_to_response
def index(req):
    return render_to_response('test.html',{})#第一个为模板文件,第二个为模板参数  

3.views变量(后台变量传递到前端显示),修改views.py:

class person():
     def __init__(self,name,age,sex):
         self.name = name
         self.age = age
         self.sex = sex
     def say(self):
          return self.name
 def index(req):
     user = {'name':'lizhong','age':'22','sex':'man'}
     user2 = person('lz','23','man')
     user3 = ['c','c++','python']
     direc = {'title':'test','hone':'Test','li':user,'zhong':user2,'web':user3}
     return render_to_response('test.html',direc)#template and parameter

Html文件中可以接收title这样的普通变量、字典、以及对象(函数返回值和属性)和列表,但最外层都需要被一个字典所包围,前后端通过该字典的key值做出匹配(优先级关系:变量>字典>对象属性>对象方法>列表),html代码如下:

<title>{{title}}</title>
</head>
<body>
<h>Hello World!!!</h>
<h1>{{hone}}</h1>
<h2>user:</h2>
<li>name:{{li.name}}</li>
<li>age:{{li.age}}</li>
<li>sex:{{li.sex}}</li>

<h2>user2:</h2>
<li>name:{{zhong.name}}</li>
<li>age:{{zhong.age}}</li>
<li>sex:{{zhong.sex}}</li>
<li>{{zhong.name}} say :I am {{zhong.say}}</li>

<h2>user3:</h2>
<li>lanuageone:{{web.0}}</li>
<li>lanuagetwo:{{web.1}}</li>
<li>lanuagethree:{{web.2}}</li>
</body>  

4.标签(if else endif ,for endfor)的使用,views.py文件:

class person():
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
        self.value = 1
    def say(self):
        return self.name

def index(req):
    user = person('lizhong',22,'man')
    direc = {'user2':user,'web':['python','c','c++']}
    return render_to_response('tagtest.html',direc)  

Html文件:

<body>
<h>Hello World!!!</h>
<h1>{{hone}}</h1>
<h2>user:</h2>
<li>name:{{li.name}}</li>
<li>age:{{li.age}}</li>
<li>sex:{{li.sex}}</li>

{% if user2.value == 1%}
	

user2:

  • name:{{user2.name}}
  • age:{{user2.age}}
  • sex:{{user2.sex}}
  • {{user2.name}} say :I am {{user2.say}}
  • {% else %} {% endif %} <h2>user3:</h2> {% for i in web %}
  • {{forloop.counter}}.lanuage:{{i}}
  • #(forloop.counter有好几种for方法,此方法可以输出序列) {% endfor %} </body>

    在Django中操作MySQL数据库

    1.在MySQL中创建DataBase
    2.配置settings.py:
    添加应用(INSTALLED_APPS),添加数据库(DataBases),安装south管理数据库

    • 安装South:

      sudo pip install South

    • 把south加入到settings.py中的INSTALL_APPS中

    INSTALLED_APPS = (
            'django.contrib.admin',
            'django.contrib.auth',
            'django.contrib.contenttypes',
            'django.contrib.sessions',
            'django.contrib.messages',
            'django.contrib.staticfiles',
            'one',  
            'south',
        )  
    
    • 修改好后运行一次python manage.py syncdb
    • 将之前建好的应用由South管理了,运行:

      python manage.py convert_to_south one(app_name)

    • 若该应用之前创建过相关的表,可以采用以下方法来“假装”用South创建的:

      python manage.py migrate one(app_name) –fake

    这个意思是,表我之前就建好了,现在只是用South记录下创建记录

    • 之后当对one(aap_name).models做修改后,执行
    python manage.py schemamigration one(app_name) --auto  
    

    再执行

    python manage.py migrate  
    

    即可
    3.编写app应用文件夹下的models.py文件

    #models.py
    from django.db import models
    class Employ(models.Model):#Databases set in setting.py  Employ is table, name is list,
            name = models.CharField(max_length = 10, null = False ,blank = False)
            age = models.PositiveSmallIntegerField(blank = False, null = False)
            sex = models.CharField(max_length = 10, null = False, blank = False)
            tel = models.CharField(max_length = 13, blank = False, null = False)
            def __unicode__(self):
                return self.name  
    

    最后附上Field常用字段及其选项

    4.在Django上操作数据库

    python manage.py shell#进入Django-shell中  
    from one.models import Employ  
    #创建  
    first_var = Employ.objects.create(name = 'cc', age = 24)  
    #查询  
    print Employ.objects.get(id = 1).name或first_var.name  
    print Employ.objects.get(id = 1).age或first_var.age  
    
    #创建  
    first_var = Employ()  
    first_var.name = "cc"  
    first_var.age = 23  
    first_var.save()  
    #查询  
    search_var = Employ.objects.all()  
    print search_var[0].name  
    print search_var[0].age  
    

    5.数据库到前端显示

    search_var = Employ.objects.all()  
    return render_to_response('index.html',{'name':search_var[0].name,'age':search_var[0].age})  
    

    或者直接将数据库传递到前端,再通过前端模板标签进行处理

    return render_to_response('index',{'person':search_var})