Django Models

django 本身提供了非常强大易使用的ORM组件,并且支持多种数据库,如sqllite,mysql,progressSql,Oracle等,当然最常用的搭配还是mysql,要启用orm,

先要配置好连接数据 的信息

我们使用MySQL配置

1)首选在setting里面配置驱动

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'OldboyWebsite', #确保此数据库已存在
        'HOST':'',                           #mysql主机名
        'PORT':'',                           #端口
        'USER':'root',                     #用户名
        'PASSWORD':''                  #密码
    }
}

Django ORM语法,为了更好的理解,我们来做一个基本的 书籍/作者/出版商 数据库结构。 我们这样做是因为 这是一个众所周知的例子,很多SQL有关的书籍也常用这个举例。

我们来假定下面的这些概念、字段和关系:

  • 一个作者有姓,有名及email地址。

  • 出版商有名称,地址,所在城市、省,国家,网站。

  • 书籍有书名和出版日期。 它有一个或多个作者(和作者是多对多的关联关系[many-to-many]), 只有一个出版商(和出版商是一对多的关联关系[one-to-many],也被称作外键[foreign key])

from django.db import models

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

class Author(models.Model):
    first_name = models.CharField(max_length=)
    last_name = models.CharField(max_length=)
    email = models.EmailField()

class Book(models.Model):
    name = models.CharField(max_length=)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

更多models field 字段:https://docs.djangoproject.com/en/1.9/ref/models/fields/


模型安装

完成这些代码之后,现在让我们来在数据库中创建这些表。 要完成该项工作,第一步是在 Django 项目中 激活这些模型。 将上面的模型所在的app (此例子app是books) 添加到配置文件的已安装应用列表中即可完成此步骤。

再次编辑 settings.py 文件, 找到 INSTALLED_APPS 设置。 INSTALLED_APPS 告诉 Django 项目哪些 app 处于激活状态。 缺省情况下如下所示:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',
]

app01是项目名称

使数据库按照模型的配置生成表结构

C:\Users\Administrator\PycharmProjects\Study>python manage.py makemigrations
C:\Users\Administrator\PycharmProjects\Study>python manage.py migrate

然后进行测试


Django Form表单

django中的Form有两种功能

输入html

验证用户输入

ModelFrom

在使用Model和Form时,都需要对字段进行定义并指定类型,通过ModelForm则可以省去From中字段的定义

class BookModelForm(forms.ModelForm):
    class Meta:
        model = models.Book
        #fields = ('name','publish_date')  #显示那些字段
        exclude = ()                     #排除那些字段
        widgets = {
            'name' : forms.TextInput(attrs={'class':"form-control"}),
        }

form

def book_modelform(request):
    form = forms.BookModelForm()  #如果是get 就直接返回return 页面
    if request.method == 'POST':    #如果是post
        print (request.POST)
        form = forms.BookModelForm(request.POST)
        if form.is_valid():         #验证
            print ("form is ok")
            print (form.cleaned_data)
            form.save()
    return render(request, 'app01/book_modelform.html', {'book_form': form})

视图 views

from app01 import views
from django.conf.urls import url,include
urlpatterns = [
    url(r'book_modelform/$',views.book_modelform),

]

Url

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post" action="">{% csrf_token %}
        {% for ele in book_form %}
           <div class="form-row"> {{ ele.name}} {{ ele }} {{ ele.errors }} </div>
        {% endfor %}
        <input type="submit" value="创建新书">
    </form>
</body>
</html>

模板文件

Django Admin

django amdin是django提供的一个后台管理页面,改管理页面提供完善的html和css,使得你在通过Model创建完数据库表之后,就可以对数据进行增删改查,而使用django admin 则需要以下步骤:

  • 创建后台管理员
  • 配置url
  • 注册和配置django admin后台管理页面

1 创建后台管理员

python manage.py createsuperuser

2 配置后台管理url

url(r'^admin/', include(admin.site.urls))

3 注册和配置django admin 后台管理页面

a 在admin中执行如下配置

from django.contrib import admin
from app01 import models

admin.site.register(models.Author)
admin.site.register(models.Book,BookAdmin)
admin.site.register(models.Publisher)

b 自定义页面展示

class BookAdmin(admin.ModelAdmin):
    list_display = ('name','publisher','publish_date')

admin.site.register(models.Author)
admin.site.register(models.Book,BookAdmin)
admin.site.register(models.Publisher)

注:如果是多对多 是不能显示的

c 添加页面搜索功能

class BookAdmin(admin.ModelAdmin):
    list_display = ('name','publisher','publish_date')
    search_fields = ('name','publisher__name')

admin.site.register(models.Author)
admin.site.register(models.Book,BookAdmin)
admin.site.register(models.Publisher)

d 添加过滤功能

class BookAdmin(admin.ModelAdmin):
    list_display = ('name','publisher','publish_date')
    search_fields = ('name','publisher__name')
    list_filter = ('publisher','publish_date')

admin.site.register(models.Author)
admin.site.register(models.Book,BookAdmin)
admin.site.register(models.Publisher)

e 其它功能

class BookAdmin(admin.ModelAdmin):
    list_display = ('id','name','publisher','publish_date')
    search_fields = ('name','publisher__name')
    list_filter = ('publisher','publish_date')
    list_editable = ('name','publisher','publish_date')  #编辑功能
    list_per_page = 5                  #分页
    filter_horizontal = ('authors',)   #选项功能
    raw_id_fields = ('publisher',)

admin.site.register(models.Author)
admin.site.register(models.Book,BookAdmin)
admin.site.register(models.Publisher)

f admin action用法

class Book(models.Model):
    name = models.CharField(max_length=)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publish_date = models.DateField()
    status_choices = (('published',u'已出版'),
                     ('producing',u'待出版'),
                     ('forbidden',u'禁书'),
                      )
    status = models.CharField(choices=status_choices,max_length=,default='producing')
    def __unicode__(self):
        return "%s" %self.name
    class Meta:
        verbose_name_plural = u'书籍'

models

admin.py

def make_forbidden(modelAdmin,request,Queryset):
    print ('-->',request,Queryset)
    Queryset.update(status='forbidden')
    make_forbidden.short_description = "Set to forbidden"

class BookAdmin(admin.ModelAdmin):
list_display = ('id','name','publisher','publish_date','status')
search_fields = ('name','publisher__name')
list_filter = ('publisher','publish_date')
list_editable = ('name','publisher')
list_per_page = 5
filter_horizontal = ('authors',)
# raw_id_fields = ('publisher',)
actions = [make_forbidden,]

admin.site.register(models.Author)
admin.site.register(models.Book,BookAdmin)
admin.site.register(models.Publisher)
 

g 状态显示颜色

class Book(models.Model):
    name = models.CharField(max_length=)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publish_date = models.DateField()
    status_choices = (('published',u'已出版'),
                     ('producing',u'待出版'),
                     ('forbidden',u'禁书'),
                      )
    status = models.CharField(choices=status_choices,max_length=,default='producing')
    def __unicode__(self):
        return "%s" %self.name
    class Meta:
        verbose_name_plural = u'书籍'

    def colored_status(self):
        if self.status == "published":
            format_td = format_html('<span style="padding:2px;background-color:yellowgreen;color:white">已出版</span>')
        elif self.status == "producing":
            format_td = format_html('<span style="padding:2px;background-color:gray;color:white">待出版</span>')
        elif self.status == "forbidden":
            format_td = format_html('<span style="padding:2px;background-color:orange;color:white">禁书</span>')

        return format_td
    colored_status.short_description = 'status'

admin.py

from django.contrib import admin

# Register your models here.
from app01 import models

def make_forbidden(modelAdmin,request,Queryset):
    print ('-->',request,Queryset)
    Queryset.update(status='forbidden')
    make_forbidden.short_description = "Set to forbidden"

class BookAdmin(admin.ModelAdmin):
    list_display = ('id','name','publisher','publish_date','colored_status')
    search_fields = ('name','publisher__name')
    list_filter = ('publisher','publish_date')
    list_editable = ('name','publisher')
    list_per_page =
    filter_horizontal = ('authors',)
    # raw_id_fields = ('publisher',)
    actions = [make_forbidden,]

admin.site.register(models.Author)
admin.site.register(models.Book,BookAdmin)
admin.site.register(models.Publisher)

Django 基础知识的更多相关文章

  1. 01 Django基础知识

    相关概念 软件框架 一个公司是由公司中的各部部门来组成的,每一个部门拥有特定的职能,部门与部门之间通过相互的配合来完成让公司运转起来. 一个软件框架是由其中各个软件模块组成的,每一个模块都有特定的功能 ...

  2. django基础知识

    一.django的安装 1. pip3 install django 2. 把安装路径加到环境变量里以便以后启动admin相关命令,在windows系统中---我的电脑---属性----高级系统设置- ...

  3. django 基础知识回顾

    内容回顾: 1. ajax参数 url: type: data: 1.value不能是字典 {k1:'v1',k2:[1,2,3,],k3; JSON.string} 2.$('').serilize ...

  4. django基础知识之Response对象

    HttpResponse对象 在django.http模块中定义了HttpResponse对象的API HttpRequest对象由Django自动创建,HttpResponse对象由程序员创建 不调 ...

  5. Django基础知识MTV

    Django简介 Django是使用Python编写的一个开源Web框架.可以用它来快速搭建一个高性能的网站. Django也是一个MVC框架.但是在Django中,控制器接受用户输入的部分由框架自行 ...

  6. Django02 Django基础知识

    一.内容回顾 1.web应用程序 2.HTTP协议 a.http协议特性 b.http请求格式 c.http响应格式 3.wsgiref模块 4.Django下载与简单应用 a.Django简介(MT ...

  7. django基础知识之布署:

    布署 从uwsgi.nginx.静态文件三个方面处理 服务器介绍 服务器:私有服务器.公有服务器 私有服务器:公司自己购买.自己维护,只布署自己的应用,可供公司内部或外网访问 公有服务器:集成好运营环 ...

  8. django基础知识之中间件:

    中间件 是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出 激活:添加到Django配置文件中的MIDDLEWARE_CLASSES元组中 每个中间件 ...

  9. django基础知识之Ajax:

    使用Ajax 使用视图通过上下文向模板中传递数据,需要先加载完成模板的静态页面,再执行模型代码,生成最张的html,返回给浏览器,这个过程将页面与数据集成到了一起,扩展性差 改进方案:通过ajax的方 ...

随机推荐

  1. iOS跳转系统设置界面

    iOS开发之如何跳到系统设置里的各种设置界面:http://www.superqq.com/blog/2015/12/01/jump-setting-per-page/ iOS:你App的设置做对了吗 ...

  2. 2px边框,4分之1内边框实现选中功能实现

    有时候我们要实现如下选中效果: 我给出一种解决办法: 首先选中的时候,加一个class(active),未选中的全部加一个class(inactive),外层给一个1px border,每个选项给一个 ...

  3. 关于scanf的返回值

    今天写一个小程序时误用while(scanf("%d",&b)!=a),以为scanf的返回值就是输入的值. 其实真相是: scanf返回接收到的变量值的个数. int a ...

  4. jq小demo—图片翻页展示效果 animate()动画

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  5. php+mysql 内联接 和 子查询

    INNER JOIN(内连接):取得两个表中存在连接匹配关系的记录 $sql="SELECT * FROM subject as a INNER JOIN e_user as b ON a. ...

  6. 教务处sso设计缺陷

    前言 刚学习python,觉得比较枯燥总不知道从哪里入手,偶然一次,同学让我帮忙看看选课,发给我的是学校统一的默认格式的密码,突然就想试试有多少人还是默认密码,从QQ群里找了一份学生信息尝试了一下,发 ...

  7. Hadoop实践

    1.将HDFS中的文本文件读取并以JSON格式转存到MongoDB时,报磁盘不足的异常. 实验室的5台计算机的存储空间都在500G以上,就目前存储的数据量来看,完全达不到磁盘接近饱和的状态.通过查看H ...

  8. FreeMarker 语法

    copy自http://demojava.iteye.com/blog/800204 以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主 ...

  9. dump报文转换为wrieshark报文

    我们开发中经常会出原始的报文,如下所示: 45 00 01 3d 8e 6a 00 00 80 11 ab 46 00 00 00 00 ff ff ff ff 00 44 00 43 01 29 6 ...

  10. Finish and error to: Error Domain=NSURLErrorDomain Code=-1001 "请求超时。

    错误显示:Finish and error to: Error Domain=NSURLErrorDomain Code=-1001 "请求超时." UserInfo={NSUnd ...