admin添加数据自动记录user到表中的实现方法,希

作者: 编程  发布:2019-08-31

django admin添加数据自动记录user到表中的实现方法,djangoadmin

1.需求:在后台添加一条数据的同时要把添加者记录到表中。

2.models.py

class Setting(models.Model): 
  ...      
  user = models.CharField(max_length=50, blank=True, help_text=u"添加者")
  ...

3.admin.py

@register(Setting)
class SettingAdmin(admin.ModelAdmin):
  list_display = ("pk", "user", "other_field")
  def save_model(self, request, obj, form, change):
    obj.user = request.user
    obj.save()
  readonly_fields = ("user", )

以上这篇django admin添加数据自动记录user到表中的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持帮客之家。

admin添加数据自动记录user到表中的实现方法,djangoadmin 1.需求:在后台添加一条数据的同时要把添加者记录到表中。 2.models.py class Se...

1.需求:在后台添加一条数据的同时要把添加者记录到表中。

Django基础,django基础教程

django admin介绍

上一章我们进行了需求分析和数据库设计。本章我们来快速搭建一个可用的后台管理系统。

后台管理系统特点:

  • 权限管理
  • 少前端样式。(样式一般不是很看重),
  • 快速开发

django的后台管理系统是一套智能的管理系统。
django的杀手锏之一就是admin管理系统。

admin在项目新建时就已经为我们生成好了。

9159.com 1

mark

Django的admin也是一个app,在我们新建项目时就创建好了。
而且会自动在url中配置好了链接。

9159.com 2

mark

访问:http://127.0.0.1:8000/admin/

可以看到admin的登录窗口。

Django是不会自动生成admin的用户的,需要我们自己去命令生成。

2.models.py

一、创建django程序

  • 终端命令:django-admin startproject sitename
  • IDE创建Django程序时,本质上都是自动执行上述命令

其他常用命令:      python manage.py runserver 0.0.0.0   #创建APP   python manage.py startapp appname   python manage.py syncdb   #创建表命令   python manage.py makemigrations   python manage.py migrate   #创建超级管理员   python manage.py createsuperuser 查看django版本   django.VERSION

createsuperuser

点击Tools 菜单下 Run manage.py Task

createsuperuser 

9159.com 3

mark

输入自己的用户名密码。

报错:

django.db.utils.DataError: (1406, "Data too long for column 'gender' at row 1")

gender中female是6位。而我们最大长度只有5.

9159.com 4

mark

修改后

makemigrations users
migrate users

然后重新createsuperuser

使用自己定义的用户名密码可以登进系统。

9159.com 5

mark

默认是用户名 密码。后面会讲到如何实现用户名 或 邮箱和密码登录。

class Setting(models.Model): 
  ...      
  user = models.CharField(max_length=50, blank=True, help_text=u"添加者")
  ...

二.配置文件

  1、数据库

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':'dbname',
    'USER': 'root',
    'PASSWORD': 'xxx',
    'HOST': '',
    'PORT': '',
    }
}

9159.com 6# 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替 # 如下设置放置的与project同名的配置的 __init__.py文件中 import pymysql pymysql.install_as_MySQLdb() View Code

2、模版

TEMPLATE_DIRS = (
        os.path.join(BASE_DIR,'templates'),
    )

3、静态文件

STATICFILES_DIRS = (
        os.path.join(BASE_DIR,'static'),
    )

修改setting中对应语言,时区,以及数据库写入时间。

修改

# 语言改为中文
LANGUAGE_CODE = 'zh-hans'

# 时区改为上海
TIME_ZONE = 'Asia/Shanghai'
# 数据库存储使用时间,True时间会被存为UTC的时间
USE_TZ = False

点击运行可以看到如下图被换成汉语的效果:

9159.com 7

mark

注意: django 2.0.1 并不会看到汉化后的默认页面。只有admin被汉化了。

组对应数据表: auth_group

在Django的admin中可以把上章的表都注册进来。对于表进行任意的增删改查。

默认其实会把user也注册进来的,但是因为我们通过userProfile覆盖了user。所以没有显示。

3.admin.py

三.路由系统 

注册UserProfile进来

users/admin.py:

# encoding: utf-8

# 因为同一个目录,所以可以直接.models
from .models import UserProfile


# 写一个管理器:命名, model Admin
class UserProfileAdmin(admin.ModelAdmin):
    pass


# 将UserProfile注册进我们的admin中, 并为它选择管理器
admin.site.register(UserProfile,UserProfileAdmin)

9159.com 8

mark

可以看到我们的用户信息就注册进来了。

USERS 是用户所在表名称。

9159.com 9

mark

进入页面可以看到Django为我们把每个不同类型的字段生成了不同的前端样式。

9159.com 10

mark

Django会自动帮我们把密码加密,而且不能反解。单向性。

如果出现错误, 可能是initial文件在我们拖入apps时路径被改变。之后我们添加了环境变量, 前面再加上apps就会报错。

这时把initial.py 中路径进行修改。

错误2:

新增用户信息提示:
Cannot add or update a child row: a foreign key constraint fails
(1452, 'Cannot add or update a child row: a foreign key constraint fails 
`mxonline`.`django_admin_log`, CONSTRAINT `django_admin_log_user_id_c564eba6_fk_auth_user_id` 
FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`))')

解决方案1: 不用解决,之后换Xadmin就好了。

解决方案2: 在setting的databases中添加以下代码取消外键检查

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mxonline2',
        'USER': 'root',
        'PASSWORD': '你的密码',
        'HOST':'127.0.0.1',
        'OPTIONS': {
          "init_command": "SET foreign_key_checks=0;",
      }

    },

}

9159.com 11

mark

实验成功为了不影响后面,把options删除

本小节结束对应commit:

admin中添加管理器&注册。时区,语言,utc(False).数据库中选项参数。female的长度修改, createsuperuser.对应5-1

@register(Setting)
class SettingAdmin(admin.ModelAdmin):
  list_display = ("pk", "user", "other_field")
  def save_model(self, request, obj, form, change):
    obj.user = request.user
    obj.save()
  readonly_fields = ("user", )

1.基础的url映射

每个路由规则对应一个view中的函数

from django.conf.urls import include, url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/$', views.index),
 ]

1.先从创建的app下的views.py面定义处理数据的函数

2.在urls.py里导入views

3.在urlpatterns里写入一条url与处理函数的l映射关系

4.url映射一般是一条正则表达式,“^” 字符串的开始,“$“ 字符串的结束

5.当写成”^$“时,不输入任何url时不会在返回黄页,而是返回后面函数里对应的页面。一般这一条会写在url的最后

如:

url(r'^$', views.index),

xadmin的安装

一套基于admin, 比admin更强大的系统。

  1. 通过pip安装
pip install xadmin

以上这篇django admin添加数据自动记录user到表中的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

2.动态路由映射

url(r'^manage/(?P<name>w*)/(?P<id>d*)', views.manage),
url(r'^manage/(?P<name>w*)', views.manage,{'id':333}),
  • 请求manage/index/1 需要 views.manage(request,name="index",id=1)

9159.com 12import re ret=re.search('(?P<id>d{3})/(?P<name>w{3})','weeew34ttt123/ooo') print(ret.group()) print(ret.group('id')) print(ret.group('name')) 正则知识

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]

Python3 & Django2.0.1安装官方适配Django2.0的包

pip install git git://github.com/sshwsfc/xadmin.git@django2

xadmin可以把我们的后台做的很强大,可扩展。

9159.com 13

mark

可以看到它同时下载了很多其他依赖包。

您可能感兴趣的文章:

  • 浅谈django model postgres的json字段编码问题
  • 使用python和Django完成博客数据库的迁移方法
  • Django 2.0版本的新特性抢先看!
  • django 2.0更新的10条注意事项总结
  • django2 快速安装指南分享
  • 关于Django显示时间你应该知道的一些问题
  • 浅谈Django自定义模板标签template_tags的用处
  • 浅谈Django学习migrate和makemigrations的差别

3.根据app对路由规则进行一次分类

url(r'^web/',include('web.urls')),

django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁

注册Xadmin 与 crispy-forms

Mxonline2/settings.py的INSTALLED_APPS中

    'xadmin',
    'crispy_forms'

然后把urls中默认admin指向Xadmin

# 导入x admin,替换admin
import xadmin
urlpatterns = [
    url(r'^xadmin/', xadmin.site.urls),
]

Python3 Django2.0.1 的url的配置中

path('xadmin/', xadmin.site.urls),

注意:Django 2.0.1中不需要加r也不需要加^

将我们原来写的user/admin.py中代码注释掉。

此时直接运行项目会报错,因为我们Xadmin的默认数据表并没有migarte

ProgrammingError: (1146, "Table 'mxonline2.xadmin_usersettings' doesn't exist")
[09/Jan/2018 06:40:27] "GET /xadmin/ HTTP/1.1" 500 150414

点击Tools 菜单下 Run manage.py Task

makemigrations
migrate

9159.com 14

mark

可以看到已经被应用成功。

前往Navicat进行验证。

9159.com 15

mark

可以看到新增的表。

Xadmin的后台采用的是bootstrap。

9159.com 16

mark

后面我们会介绍如何制作插件

四.模板

源码安装:

github: https://github.com/sshwsfc/xadmin

下载或git clone将源码下载到本地。

9159.com 17

mark

解压后将Xadmin文件夹复制到我们的项目中。

9159.com 18

mark

1.模版的执行

模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户

9159.com 19def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html) View Code 9159.com 20from django import template t = template.Template('My name is {{ name }}.') c = template.Context({'name': 'Adrian'}) print t.render(c) View Code 9159.com 21from django.template.loader import get_template from django.template import Context from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() t = get_template('current_datetime.html') html = t.render(Context({'current_date': now})) return HttpResponse(html) View Code 9159.com 22return render_to_response('Account/Login.html',data,context_instance=RequestContext(request)) View Code

Python3版本源码安装:与url配置不同

git clone -b django2 https://github.com/sshwsfc/xadmin.git

其余操作一样。

2.模板语言

详参

新建extra_apps,并在setting中注册地址

新建new package: extra_apps

使用该目录存放我们的第三方插件,将Xadmin移入。
右键mark为SourceRoot, 但是这时候cmd下回报错。

所以在setting.py中加入。

sys.path.insert(0,os.path.join(BASE_DIR, 'extra_apps'))

因为我们的source目录已经有Xadmin了,就不会再去系统环境中找了。这时候卸载我们的Xadmin。

workon mxonline2
pip uninstall xadmin

但是他的依赖包我们还需要,所以只需要卸载Xadmin。此时我们运行会报错

    from future.utils import iteritems
ImportError: No module named future.utils

安装必要的包:

pip install future
pip install six
pip install httplib2
pip install django-import-export

此时又可以成功运行了

9159.com 23

mark

日志记录:后台管理人员做的操作都会生成一条记录。

源码安装优点:

  • xadmin新特性
  • 对于源码进行自己的修改。

本小节结束对应commit:

Xadmin的安装与源码安装,配置setting中extra_apps. 对应5-2

五.django视图

http请求中产生两个核心对象:

http请求:HttpRequest对象

http响应:HttpResponse对象

所在位置:django.http

之前我们用到的参数request就是HttpRequest    检测方法:isinstance(request,HttpRequest)

users app 的model注册

1 HttpRequest对象的属性:

9159.com 24

9159.com 25

9159.com 26# path: 请求页面的全路径,不包括域名 # # method: 请求中使用的HTTP方法的字符串表示。全大写表示。例如 # # if req.method=="GET": # # do_something() # # elseif req.method=="POST": # # do_something_else() # # GET: 包含所有HTTP GET参数的类字典对象 # # POST: 包含所有HTTP POST参数的类字典对象 # # 服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过 # HTTP POST方法提交请求,但是表单中可能没有数据,因此不能使用 # if req.POST来判断是否使用了HTTP POST 方法;应该使用 if req.method=="POST" # # # # COOKIES: 包含所有cookies的标准Python字典对象;keys和values都是字符串。 # # FILES: 包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中 name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys: # # filename: 上传文件名,用字符串表示 # content_type: 上传文件的Content Type # content: 上传文件的原始内容 # # # user: 是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前 # 没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你 # 可以通过user的is_authenticated()方法来辨别用户是否登陆: # if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware # 时该属性才可用 # # session: 唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。 View Code

HttpRequest对象的方法:get_full_path(),   比如: ,req.get_full_path()得到的结果就是/index33/?name=123

遗留问题: django2.0.1使用xadmin时。如验证码等带dateTimefield区域出错。

xadmin/widgets.py

9159.com 27

mark

input_html = [ht for ht in super(AdminSplitDateTime, self).render(
    name, value, attrs).split('/><') if ht != '']
        if (len(input_html) > 1):
            input_html[0] = input_html[0]   "/>"
            input_html[1] = "<"   input_html[1]

9159.com 28

mark

此时可以看到已经运行正常

2 HttpResponse对象:

   对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象。

  HttpResponse类在django.http.HttpResponse

  在HttpResponse对象上扩展的常用方法:页面渲染:render,render_to_response,

                                                        页面跳转:redirect

                                                        locals:   可以直接将函数中所有的变量传给模板    

9159.com 29<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1 style="color:blue">hello world</h1> <h1 style="color:blue">{{name}}</h1> </body> </html> View Code

真正开始

Xadmin是基于Django的admin来开发的,所以Xadmin也继承了许多admin的用法。

  • 比如: models的注册。

UserProfile已经被自动注册进去了,我们从验证码开始注册。

我们需要新建一个adminx.py文件,Xadmin会自动搜寻这种命名的文件。

六.model

到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:

  • 创建数据库,设计表结构和字段
  • 使用 MySQLdb 来连接数据库,并编写数据访问层代码
  • 业务逻辑层去调用数据访问层执行数据库操作

9159.com 30import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='db1', passwd='1234', host='localhost') cursor = db.cursor() cursor.execute(sql) data = cursor.fetchall() db.close() return data def GetSingle(sql): db = MySQLdb.connect(user='root', db='db1', passwd='1234', host='localhost') cursor = db.cursor() cursor.execute(sql) data = cursor.fetchone() db.close() return data View Code

django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM)。

  PHP:activerecord

  Java:Hibernate 

    C#:Entity Framework

django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表

详细见:

新建py文件的初始化模板

9159.com 31

mark

新建users/adminx.py:

# encoding: utf-8
__author__ = 'mtianyan'
__date__ = '2018/1/9 0009 08:02'

import xadmin

from .models import EmailVerifyRecord


# 创建admin的管理类,这里不再是继承admin,而是继承object
class EmailVerifyRecordAdmin(object):
    pass


xadmin.site.register(EmailVerifyRecord, EmailVerifyRecordAdmin)

9159.com 32

mark

可以看到这时候访问已经有邮箱验证码了。

邮箱验证码这几个字就是我们代码中Meta中verbose_name定义的:

    class Meta:
        verbose_name = "邮箱验证码"
        verbose_name_plural = verbose_name

verbose_name_pluralverbose_name的复数形式。

字段的verbose_name会直接显示在后台。sendtypesendtime没有设置所以直接显示了英文。

9159.com 33

mark

可以看到我们添加验证码成功。注意:上节版本中我们进行了: makemigaration & migrate。
但是它是pip安装的Xadmin的数据表生成。我们卸载之后,源码安装需要重新运行进行数据迁移。(django需要通过app文件夹下的init文件来记录表的更改记录,pip的都卸了,所以就没法找到了)

会报错:

Xadmin_log不存在错误。只需要运行这两条命令即可。

9159.com 34

mark

七.中间件

django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。

在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下图。

9159.com 35 

与mange.py在同一目录下的文件夹 wupeiqi/middleware下的auth.py文件中的Authentication类

中间件中可以定义四个方法,分别是:

  • process_request(self,request)
  • process_view(self, request, callback, callback_args, callback_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
  • process_response(self, request, response)

以上方法的返回值可以是None和HttpResonse对象,如果是None,则继续按照django定义的规则向下执行,如果是HttpResonse对象,则直接将该对象返回给用户

9159.com 36

解决后台部分英文显示

全部models中字段自行添加verbose_name

9159.com 37

mark

这里就不贴出来了,自行检查都加上(没写出的请自行修改全部加上verbose_name)。

八.自定义中间件

解决EmailVerifyRecord object显示

全部(没写出的请自行修改)model,py2:重载__unicode py3:重载__str__

    # 重载Unicode方法使后台不再直接显示object
    def __unicode__(self):
        return '{0}({1})'.format(self.code,self.email)

上面代码是python的自身基础语法。

9159.com 38

mark

9159.com 39

mark

1.创建中间件类

class RequestExeute(object):

    def process_request(self,request):
        pass
    def process_view(self, request, callback, callback_args, callback_kwargs):
        i =1
        pass
    def process_exception(self, request, exception):
        pass

    def process_response(self, request, response):
        return response

2、注册中间件

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'wupeiqi.middleware.auth.RequestExeute',
)

配置显示列

9159.com 40

mark

users/adminx.py的管理器中设置list_display:

# 创建admin的管理类,这里不再是继承admin,而是继承object
class EmailVerifyRecordAdmin(object):
    # 配置后台我们需要显示的列
    list_display = ['code', 'email','send_type', 'send_time']

list_display可以使用列表或元祖,建议使用列表。否则元组只有一个元素,忘记加逗号就会报错。

9159.com 41

mark

选择框的生成是因为我们加上了choices

九.Admin

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

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

配置搜索searchfield

users/adminx.py的管理器中EmailVerifyRecordAdmin添加

    # 配置搜索字段,不做时间搜索
    search_fields =  ['code', 'email','send_type']

9159.com 42

mark

再添加一条数据验证搜索功能

9159.com 43

mark

9159.com 44

mark

1.创建后台管理员

python manage.py createsuperuser

xadmin导出csv中文乱码解决

9159.com 45

mark

charset=utf-8 改为charset=gbk

2.配置后台管理url

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

xadmin导出xml报错

TypeError at /xadmin/users/emailverifyrecord/
unicode argument expected, got 'str'

io.StringIO这个库新版本的python3直接往这个库中加入了一些新的内容,使得该库在Python2.7中较为混乱。

9159.com 46

mark

将StringIo变为BytesIO

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

  a.在admin中执行如下配置

from django.contrib import admin

from app01 import  models

admin.site.register(models.UserType)
admin.site.register(models.UserInfo)
admin.site.register(models.UserGroup)
admin.site.register(models.Asset)

b.设置数据表名称

9159.com 47class UserType(models.Model): name = models.CharField(max_length=50) class Meta: verbose_name = '用户类型' verbose_name_plural = '用户类型' View Code

c.打开表之后,设定默认显示,需要在model中作如下配置

9159.com 48class UserType(models.Model): name = models.CharField(max_length=50) def __unicode__(self): return self.name View Code 9159.com 49from django.contrib import admin from app01 import models class UserInfoAdmin(admin.ModelAdmin): list_display = ('username', 'password', 'email') admin.site.register(models.UserType) admin.site.register(models.UserInfo,UserInfoAdmin) admin.site.register(models.UserGroup) admin.site.register(models.Asset) View Code

d.为数据表添加搜索功能

9159.com 50from django.contrib import admin from app01 import models class UserInfoAdmin(admin.ModelAdmin): list_display = ('username', 'password', 'email') search_fields = ('username', 'email') admin.site.register(models.UserType) admin.site.register(models.UserInfo,UserInfoAdmin) admin.site.register(models.UserGroup) admin.site.register(models.Asset) View Code

通过时间筛选字段。

users/adminx.py的管理器中EmailVerifyRecordAdmin添加

    # 配置筛选字段
    list_filter =  ['code', 'email','send_type', 'send_time']

9159.com 51

mark

e.添加快速过滤

9159.com 52from django.contrib import admin from app01 import models class UserInfoAdmin(admin.ModelAdmin): list_display = ('username', 'password', 'email') search_fields = ('username', 'email') list_filter = ('username', 'email') admin.site.register(models.UserType) admin.site.register(models.UserInfo,UserInfoAdmin) admin.site.register(models.UserGroup) admin.site.register(models.Asset) View Code

一、创建django程序 终端命令:django-admin startproject sitename IDE创建Django程序时,本质上都是自动执行上述命令 其他...

Django的admin, Xadmin和其他系统区别

不像php等其他语言是一个功能模块一个功能设计的。
Django是对于每张表增删改查的管理器,我们可以在增删改成的基础上加上我们自己的后台逻辑。
因此某种程度可以说他是不依赖于具体业务的。不管啥系统后台都是由表组成。

不依赖于后台逻辑,又可以加上逻辑。

user/models的注册

users/adminx.py中

# 创建banner的管理类
class BannerAdmin(object):
    list_display = ['title', 'image', 'url','index', 'add_time']
    search_fields = ['title', 'image', 'url','index']
    list_filter = ['title', 'image', 'url','index', 'add_time']

# 将model与admin管理器进行关联注册
xadmin.site.register(Banner, BannerAdmin)

此时后台页面。

9159.com 53

mark

可以自行测试轮播图是否可以新建成功。

本小节结束对应commit:

usersmodels三张表注册进xadmin, 配置搜索过滤展示字段,修复xadmin导出xml错误,导出csv乱码,Unicode重载。对应5-3

py3(django2.0.1):

usersmodels三张表注册进xadmin, 配置搜索过滤展示字段,修复xadmin导出csv乱码,修复django2.0.1的indexError, str重载。对应5-3

本文由9159.com发布于编程,转载请注明出处:admin添加数据自动记录user到表中的实现方法,希

关键词: 9159.com