django的工程创建和基础配置

django的工程创建和基础配置

工程创建和数据库

创建工程

$ django-admin.py startproject firstweb

创建之后目录结构如下

firstweb
├── firstweb
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

manage.py用于创建app,相当于一个管理者.settings中包含工程的配置设置, urls中 设置主要的路由。,WSGI就像是一座桥梁,一边连着web服务器,另一边连着用户的应用。但是呢,这个桥的功能很弱,有时候还需要别的桥来帮忙才能进行处理

$ ./manage.py startapp booksite
.
├── booksite
│   ├── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── firstweb
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   └── wsgi.py
└── manage.py

创建模型 该模型中的类对应着表 属性对应着字段

  1 from django.db import models
  2 
  3 # Create your models here.
  4 
  5 
  6 class BookInfo(models.Model):
  7     btitle = models.CharField(max_length=10)
  8     bpub_date = models.DateTimeField()
  9 
 10 class HeroInfo(models.Model):
 11 
 12     hname = models.CharField(max_length=10)
 13     hgender = models.BooleanField()
 14     hcontent = models.CharField(max_length=100)
 15     hBook = models.ForeignKey(BookInfo)

设计好之后 可以按照表转为 sql语句 准备创建

./manage.py makemigrations

创建迁移之后 就按照迁移 创建数据库

./manage.py migrate

Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0001_initial... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying sessions.0001_initial... OK
  Applying sites.0001_initial... OK

就产生了bookdb数据库, 这个名字在setting中设置, 数据库类型也在setting中可以设置

.
├── bookdb
├── booksite
│   ├── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── firstweb
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   └── wsgi.py
└── manage.py

通过shell可以在 命令行中创建 添加数据

./manage.py shell

>>> from booksite.models import *
>>> 
>>> 
>>> 
>>> b = BookInfo()
>>> b.btitle = '天龙八部'
>>> 
>>> from datetime import datetime

>>> b.bpub_date = datetime(2012,10,1)
>>> b.save()

>>> h = HeroInfo()
>>> h.hname = '乔峰'
>>> h.hgender = True
>>> h.hcontent = '降龙十八掌'
>>> h.hBook = b
>>> h.save()

h.hBook = b之后
b中就有一个heroinfo_set 这个集合中保存着 所有的 被引用到了那些英雄。
实质是在 把自己的id主键 赋值给 hero了。也就算是说hero引用了book主键

可以在这个集合中直接添加,不需要再一个个绑定了

整个对象作为外键 也可以快速绑定,自动把b的主键id给创建的新对象

>>> b.heroinfo_set.create(hname='虚竹',hgender=True, hcontent='北冥神功')
<HeroInfo: HeroInfo object>

##后台admin管理

主要步骤

  • 创建超级管理员 python manage.py createsuperuser
  • 到app目录下 注册 admin.site.register(class)

登陆 admin就可以访问了
但是界面中没有我们的两个表 需要注册
到app下的 admin.py中 注册控制显示效果

  1 from django.contrib import admin
  2 from models import *
  3 # Register your models here.
  4 #控制内嵌
  5 class HeroInline(admin.StackedInline):
  6     model = HeroInfo
  7     extra = 2
  8 #控制显示字段 和内嵌显示
  9 class BookAdmin(admin.ModelAdmin):
 10     inlines = [HeroInline]
 11     list_display = ['btitle', 'bpub_date']
 12 class HeroAdmin(admin.ModelAdmin):
 13     list_display = ['id', 'hname', 'gender']
 14 #注册类 显示  gender是一个方法  可以用models的返回值作为显示值
 15 admin.site.register(BookInfo, BookAdmin)
 16 admin.site.register(HeroInfo, HeroAdmin)

内联2是在Book显示的时候 多显示两个hero添加而已

  • 创建添加类 类中设置添加的类名 和个数
  • 把这个添加类 绑定到需要的admin类中的inlines 中
  • 样式中还有Tablur样式

利用admin中显示字段list_display = [方法, 字段]
方法的返回值就是显示的效果值

class HeroInfo(models.Model):

    hname = models.CharField(max_length=20)
    hcontent = models.CharField(max_length=100)

    hgender = models.BooleanField()
    hBook = models.ForeignKey(BookInfo)

    def gender(self):
        if self.hgender:
                return '男'
        else:
                return '女'
    def __str__(self):
        return self.hname.encode('utf-8')

模板

模板注意的是新版的django 需要设置DIRS
到setting文件中

#这个是 setting文件的  文件夹, 的 文件夹 路径 , 也就是 工程大文件夹路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

根据已经有的BASE_DIR 拼接 模板路径

 56 TEMPLATES = [
 57     {
 58         'BACKEND': 'django.template.backends.django.DjangoTemplates',
 59         'DIRS': [os.path.join(BASE_DIR, 'templates')],
 60         'APP_DIRS': True,
 61         'OPTIONS': {
 62             'context_processors': [
 63                 'django.template.context_processors.debug',
 64                 'django.template.context_processors.request',
 65                 'django.contrib.auth.context_processors.auth',
 66                 'django.contrib.messages.context_processors.messages',
 67             ],
 68         },
 69     },
 70 ]

##视图函数渲染


from django.shortcuts import render
from django.http import HttpResponse
#from django.template import RequestContext, loader
# Create your views here.
from models import *


def index(request):
    alist = BookInfo.objects.all()

    #t = loader.load('oneapp/index.html')
    #context = RequestContext(request, {'list':alist})
    # return HttpResponse(t.render(context))
    return render(request, 'oneapp/index.html', {'list': alist})
  • 两种方式都可以渲染 返回模板 后边的render 更加简单一点

##urls配置

参数传递 直接给视图函数的形参

比如输入’127.0.0.1:8000/1/‘

根据urls定位到 视图函数

工程url 主要起到大分类的作用

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'', include('oneapp.urls')),
]

app中的url

urlpatterns = [
    url(r'^$', views.index),
    url(r'^([0-9]+)/$', views.detail),
]

数字1传入到了 aid中

def detail(request, aid):
    book1 = BookInfo.objects.get(pk=aid)
    return render(request, 'oneapp/detail.html', {'book': book1})
    # return HttpResponse('%s'%aid)

注意:如果 出现migrations错误删除 文件夹 重新创建迁移

本文总阅读量