[关闭]
@rickyChen 2017-02-14T16:48:44.000000Z 字数 6183 阅读 2429

Python Django App开发

Python Django


创建一个简易的Django App

  1. 新建一个app

    1. python manage.py startapp yourappname
  2. 新建一些目录,使该app拥有以下目录结构:

    1. .
    2. ├── admin.py
    3. ├── __init__.py
    4. ├── migrations
    5.    ├── __init__.py
    6. ├── models.py
    7. ├── static
    8.    ├── yourappname
    9.    └── index.css
    10. ├── templates
    11.    └── yourappname
    12.    └── index.html
    13. ├── tests.py
    14. ├── urls.py
    15. ├── views.py
  3. 在settings.py中加入新建的app

  1. INSTALLED_APPS = (
  2. 'grappelli',
  3. 'django.contrib.admin',
  4. 'django.contrib.auth',
  5. 'django.contrib.contenttypes',
  6. 'django.contrib.sessions',
  7. 'django.contrib.messages',
  8. 'django.contrib.staticfiles',
  9. 'yourappname',
  10. )
  1. 在app下编写你的代码,其中templates编写你的html代码,static编写你的css、js代码

Django开发过程中需要注意的地方

Django 模板(template)

公共模板

  1. 新建一个app(base),目录结构如下

    1. .
    2. ├── admin.py
    3. ├── __init__.py
    4. ├── migrations
    5. ├── __init__.py
    6. ├── models.py
    7. ├── static //存储整个Web的静态文件
    8. ├── base
    9. └── index.css
    10. ├── templates //存储公共静态html模版
    11. └── base
    12. └── index.html
    13. ├── tests.py
    14. ├── urls.py
    15. ├── views.py
  2. base/static/base/目录下新建文件header.html作为整个Web公共导航栏

  3. header.html文件内容如下

    1. {% load staticfiles %}
    2. <!DOCTYPE HTML>
    3. <html>
    4. <head>
    5. <title>数据分析平台</title>
    6. <link rel="stylesheet" href="{% static 'base/bootstrap/css/bootstrap.min.css' %}">
    7. {% block js_content%}{% endblock %}
    8. </head>
    9. <body>
    10. <div class="nav">
    11. <div class="collapse navbar-collapse">
    12. <div class="navbar-header">
    13. <span class="navbar-brand" style="color:#fff">数据分析平台</span>
    14. </div>
    15. <ul class="nav nav-pills navbar-nav ">
    16. <li>
    17. <a href="{% block url_homepage%}/{% endblock%" role="button" >首页</a>
    18. </li>
    19. <li>
    20. <a href="/project/register_project/" role="button">服务申请 </a>
    21. </li>
    22. </ul>
    23. </div>
    24. </div>
    25. {% block page_content %}{% endblock %}
    26. </body>
    27. </html>
  4. 在上面的代码中,有多个类似{% block defineName%}{% endblock %}的代码块出现,在每个app调用公共模块时,会再次用到这些代码块。
  5. home.html文件中公共模块使用代码如下:

    1. {% extends "base/header.html" %} //模块调用语句
    2. {% load staticfiles %}
    3. {% block url_homepage %}#{% endblock %}
    4. {% block js_content %}
    5. {% endblock%}
    6. {% block page_content %}
    7. {% endblock%}
  6. 由实例得出公共模块使用说明

    • 公共模版,完成了html代码的整体框架,我们需要在不同的app上为每个app添加该app特有的代码。
    • 类似{% block defineName%}{% endblock %}的代码块中填写每个app特定的代码部分,例如上面{% block js_content %}{% endblock%}中填该app的独有的javascrit代码
    • 在公共模版中,可以在{% block defineName%}{% endblock %}中赋予默认值,若在app中不调用这个代码块,最终html代码将会使用默认值。

自定义标签和过滤器

Django 数据库开发相关问题

Django建表

  1. 修改某app下model.py文件,创建与表相关的类

    1. from __future__ import unicode_literals
    2. from django.db import models
    3. from django_enumfield import enum
    4. class Publisher( models.Model ):
    5. name = models.CharField( max_length=256, blank=True, null = True )
    6. address = models.CharField( max_length=256, blank=True, null = True )
    7. city = models.CharField( max_length=256, blank=True, null = True )
    8. state_province = models.CharField( max_length=256, blank=True, null = True )
    9. country = models.CharField( max_length=256, blank=True, null = True )
    10. website = models.CharField( max_length=256, blank=True, null = True )
    11. class Meta:
    12. db_table = 'publisher'
  2. 同步数据库

    1. python manage.py syncdb
    2. //注意:Django 1.7 及以上的版本需要用以下命令
    3. python manage.py makemigrations
    4. python manage.py migrate

Django数据库操作

  1. 插入数据

    1. from books.models import Publisher
    2. p1 = Publisher(name='Apress', address='2855 Telegraph Avenue', city='Berkeley', state_province='CA', country='U.S.A.', website='http://www.apress.com/')
    3. p1.save()
  2. 查询
    获取全部对象

    1. Publisher.objects.all()

    根据条件查询

    1. Publisher.objects.filter(name='Apress')
    2. //查询名字为Apress的出版社
    3. Publisher.objects.exclude(name='Apress')
    4. //查询名字不为Apress的出版的

    查询结果排序

    1. Publisher.objects.filter(name='Apress').order_by("country")
    2. Publisher.objects.filter(name='Apress').order_by("_country")
    3. //结果按倒序排列

    限定查询结果

    1. Publisher.objects.filter(name='Apress')[10]
    2. //相当于limit 10
  3. 更新

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

    1. p = Publisher.objects.get(name='Apress') #先查询
    2. p.name = 'Apress Publishing' #更新
    3. p.save() #保存
  4. 删除

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

Django多数据库路由使用

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME': 'elk_portal',
  5. #表名
  6. 'USER': 'username',
  7. 'PASSWORD': 'password',
  8. 'HOST': 'hostname',
  9. 'PORT': 'port',
  10. # There is no need to set option when database charset is utf8
  11. 'OPTION': {
  12. # 'charset': 'utf8',
  13. # 'init_command': 'SET character_set_client=\'utf8\';SET character_set_connection=\'utf8\';SET character_set_results=\'utf8\'',
  14. # equals to 'init_command': 'SET NAMES \'utf8\'',
  15. }
  16. },
  17. 'agg_system':{
  18. 'ENGINE': 'django.db.backends.mysql',
  19. 'NAME': 'agg_system',
  20. 'USER': 'username',
  21. 'PASSWORD': 'password',
  22. 'HOST': 'hostname',
  23. 'PORT': 'port',
  24. }
  25. #这里新建了一个名为'agg_system'的路由出口
  26. }
  1. #-*- coding: utf-8 -*-
  2. class MossDBRouter(object):
  3. """A router to control all database operations on models in
  4. the myapp application"""
  5. def db_for_read(self, model, **hints):
  6. "Point all operations on myapp models to 'other'"
  7. return self.__app_router(model)
  8. def db_for_write(self, model, **hints):
  9. "Point all operations on myapp models to 'other'"
  10. return self.__app_router(model)
  11. def allow_relation(self, obj1, obj2, **hints):
  12. "Allow any relation if a model in myapp is involved"
  13. return obj1._meta.app_label == obj2._meta.app_label
  14. def allow_syncdb(self, db, model):
  15. "Make sure the myapp app only appears on the 'other' db"
  16. return self.__app_router(model) == db
  17. def __app_router(self, model):
  18. """
  19. 为不同的app指定路由出口
  20. """
  21. if model._meta.app_label == 'analysis':
  22. return 'agg_system'
  23. elif model._meta.app_label == 'report':
  24. return 'agg_system'
  25. else:
  26. return 'default'
  1. DATABASE_ROUTERS = ['portal.dbrouter.MossDBRouter']
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注