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. js事件监听-addEventListener (w3c标准) 和 attachEvent(ie)

    研究了一个小时,没看懂这两个属性 window.onload = function(){ var oDiv = document.getElementById("J_myDiv") ...

  2. 安卓工程中定义的app_name等报错解决办法 工程上有叹号

    类似于"app_name" is not translated in af, am, ar, be, bg, ca, cs, da, de, el, en-rGB, es, es- ...

  3. 给go添加各种package

    go version 1.1.2 For example you need to install the webscoket pakeage try           go get code.goo ...

  4. springmvc获取jar中的静态资源与jar包中的资源互相引用问题

    1.首先看jar中的文件位置 2.在web工程中引用该jar 并且在springmvc文件中配置路径 如果有多个路径可用逗号隔开 3.在web工程找jsp页面如何引用 这样就可以了 关于jar中的资源 ...

  5. LINUX利用Speedtest测速

    那么远程服务器呢?要知道大多数远程服务器是没有浏览器可以打开web页面的.用浏览器打开网页测速的瓶颈就在此,你不能按计划的对服务器进行定期的常规测试.这时需要到一个名为Speedtest-cli的软件 ...

  6. ubuntu 设置静态IP之后不能上网。

    一个同事设置之后不能上网. 根据经验DNS有问题. 所以就设置8.8.8.8 之后就好了 DONE

  7. 关于最新版本的log4net使用中遇到的问题

    Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...

  8. 简单封装常用js方法

    1.uploadfiy插件封装 /* 参数:uploadID:上传控件ID url:请求后台url路径   callback:回调函数 */ uploadfiy({ uploadID: $('#btn ...

  9. Online Procurement Auctions for Resource Pooling in Client-Assisted Cloud Storage Systems---INFOCOM 2015

    [标题] [作者] [来源] [对本文评价] [why] 存在的问题 [how] [不足] assumption future work [相关方法或论文] [重点提示] [其它]

  10. The Skyline Problem leetcode 详解

    class Solution { public: vector<pair<int, int>> getSkyline(vector<vector<int>&g ...