首页 技术 正文
技术 2022年11月15日
0 收藏 540 点赞 4,348 浏览 6881 个字

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 modelsclass 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 viewsfrom django.conf.urls import url,includeurlpatterns = [    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 adminfrom app01 import modelsadmin.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 modelsdef 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)
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,087
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,562
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,412
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,185
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,821
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905