一 、先设置一些相关配置

1. 创建数据库模型。 在app01 下创建

from django.db import models

# Create your models here.

class Author(models.Model):
nid = models.AutoField(primary_key=True)
name=models.CharField( max_length=)
age=models.IntegerField() # 与AuthorDetail建立一对一的关系
authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE) class AuthorDetail(models.Model): nid = models.AutoField(primary_key=True)
birthday=models.DateField()
telephone=models.BigIntegerField()
addr=models.CharField( max_length=) class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name=models.CharField( max_length=)
city=models.CharField( max_length=)
email=models.EmailField() class Book(models.Model): nid = models.AutoField(primary_key=True)
title = models.CharField( max_length=)
publishDate=models.DateField()
price=models.DecimalField(max_digits=,decimal_places=) # 与Publish建立一对多的关系,外键字段建立在多的一方
publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE)
# 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
authors=models.ManyToManyField(to='Author',)

然后在迁移 . 命令为 python manage.py makemigrations   /  python manage.py migrate 

2 . 创建数据库模型在,app02 下面

3. 然后在settings里进行配置.

4. 设置静态文件路径

5. 设置数据库

6. URL路由

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

class XadminSite(object):

    def __init__(self, name='admin'):
self._registry = {} def get_urls(self): print(self._registry) # {Book:modelAdmin(Book),.......} temp = []
for model, admin_class_obj in self._registry.items():
# 获取当前循环的model的字符串与所在app的字符串
app_name = model._meta.app_label # "app01"
model_name = model._meta.model_name # "book" temp.append(url(r'^{0}/{1}/'.format(app_name, model_name),admin_class_obj.urls2), ) '''
url(r"app01/book",ModelXadmin(Book,site).urls2)
url(r"app01/publish",ModelXadmin(Publish,site).urls2)
url(r"app02/order",ModelXadmin(Order,site).urls2) '''
return temp @property
def urls(self):
return self.get_urls(),None,None def register(self, model, admin_class=None, **options):
if not admin_class:
admin_class = ModelXadmin self._registry[model] = admin_class(model, self) # {Book:ModelAdmin(Book),Publish:ModelAdmin(Publish)} site=XadminSite()

XadminSite 类

self._registry 打印的东西

打印结果:

{<class 'app01.models.Book'>: <app01.Xadmin.BookConfig object at 0x0000016253049BA8>,
<class 'app01.models.Publish'>: <Xadmin.service.Xadmin.ModelXadmin object at 0x0000016253049BE0>,
<class 'app01.models.Author'>: <Xadmin.service.Xadmin.ModelXadmin object at 0x0000016253049CC0>,
<class 'app01.models.AuthorDetail'>: <Xadmin.service.Xadmin.ModelXadmin object at 0x00000162530520F0>,
<class 'app02.models.Order'>: <Xadmin.service.Xadmin.ModelXadmin object at 0x0000016253052358>,
<class 'app02.models.Food'>: <app02.Xadmin.FoodConfig object at 0x0000016253052390>}
    def add_view(self, request):
return render(request, 'add_view.html') def change_view(self, request, id):
return render(request, 'change_view.html') def delete_view(self, request, id):
return render(request, 'delete_view.html') def get_urls2(self):
temp = [] temp.append(url(r"^$", self.list_view))
temp.append(url(r"^add/$", self.add_view))
temp.append(url(r"^(\d+)/change/$", self.change_view))
temp.append(url(r"^(\d+)/delete/$", self.delete_view)) return temp

处理表头数据 放在了 ModelXadmin python文件夹下 :

处理表头数据

    def list_view(self, request):
print("self.model", self.model) # 用户访问哪张表,self.model就是谁。
model_name=self.model._meta.model_name
data_list = self.model.objects.all()
print("list_display:",self.list_display) ## ['title', 'prcie'] # 处理表头
#header_list=["ID","书籍名称","出版社"]
header_list=[] for field in self.list_display: # [check,"nid","title","publish",edit,delete]
if isinstance(field,str):
if field=="__str__":
val= self.model._meta.model_name.upper()
else:
field_obj=self.model._meta.get_field(field)
val=field_obj.verbose_name else:
val=field(self,is_header=True) # 获取表头,传is_header=True

处理表单数据

# 处理表单数据
new_data_list=[]
for obj in data_list: # data_list [book_obj,book_obj2,...] temp=[]
for field in self.list_display: # ['title', 'prcie',edit,delete]
if isinstance(field,str):
val=getattr(obj,field)
else:
val=field(self,obj) temp.append(val) new_data_list.append(temp)

处理表单数据

在Xadmin文件下的app 文件中添加如下代码

 from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modules class XadminConfig(AppConfig):
name = 'Xadmin'
def ready(self):
autodiscover_modules('Xadmin')

处理表头数据

class ModelXadmin(object):
list_display=["__str__",] def __init__(self,model,site):
self.model =model
self.site =site def list_view(self,request):
print("self.model9999999999999",self.model) #用户访问哪张表,self.model就是谁。
    self.model9999999999999 <class 'app01.models.Book'>

model_name =self.model._meta.model_name

        data_list = self.model.objects.all()
print("list_display",self.list_display)##['title','price]
    list_display [<function BookConfig.check at 0x000001A2AF7C5730>, 'nid', 'title', 'publish', 'price', <function BookConfig.edit at 0x000001A2AF7BBAE8>, <function BookConfig.delete at 0x000001A2AF7C57B8>]

#处理表头
header_list=[]
#[check,'nid','title','publish','price',edit,delete]
for field in self.list_display:# model类的字段
if isinstance(field,str):
if field =='__str__':
print(field)
                    val =self.model._meta.model_name.upper()
print('val',val)
else:
field_obj =self.model._meta.get_field(field)
print('11111111111',field_obj)
val =field_obj.verbose_name
print(val)
11111111111 app01.Book.nid
nid
11111111111 app01.Book.title
title
11111111111 app01.Book.publish
publish
11111111111 app01.Book.price
price


            else:
val = field(self,is_header=True) #获取表头,传is_header=True
header_list.append(val)

输出结果:

self.model9999999999999 <class 'app01.models.Book'>
list_display [<function BookConfig.check at 0x000001A2AF7C5730>, 'nid', 'title', 'publish', 'price', <function BookConfig.edit at 0x000001A2AF7BBAE8>, <function BookConfig.delete at 0x000001A2AF7C57B8>]
app01.Book.nid
nid
app01.Book.title
title
app01.Book.publish
publish
app01.Book.price
price
Book object

表单数据body 的处理 

   #处理表单数据
new_data_list=[]
for obj in data_list:# data_list [book_obj,book_obj2...]
print(obj)
temp =[]
for field in self.list_display:
if isinstance(field,str):
val = getattr(obj,field)
else:
val =field(self,obj)
temp.append(val)
new_data_list.append(temp)
print('',new_data_list)
return render(request, 'list_view.html', {"new_data_list": new_data_list,"model_name":model_name,"header_list":header_list})

结果:

8888 [[None, 1, 'linux', <Publish: 五道口出版社>, Decimal('111.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"]]
Book object
8888 [[None, 1, 'linux', <Publish: 五道口出版社>, Decimal('111.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 2, 'go', <Publish: 上地出版社>, Decimal('222.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"]]
Book object
8888 [[None, 1, 'linux', <Publish: 五道口出版社>, Decimal('111.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 2, 'go', <Publish: 上地出版社>, Decimal('222.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 3, 'python', <Publish: 五道口出版社>, Decimal('333.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"]]
Book object
8888 [[None, 1, 'linux', <Publish: 五道口出版社>, Decimal('111.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 2, 'go', <Publish: 上地出版社>, Decimal('222.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 3, 'python', <Publish: 五道口出版社>, Decimal('333.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"], [None, 4, 'c', <Publish: 清华出版社>, Decimal('444.00'), "<a herf ='Book object/change/>编辑</a>", "<input type ='checkbox'>"]]

  

day 84 Xadmin组件之构建表单数据的更多相关文章

  1. Promise实现子组件的多表单校验并反馈结果给父组件

    全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/11529207.html,多谢,=.=~ 本文中多表单验证主要用到Promise.all()实现多 ...

  2. day75 form 组件(对form表单进行输入值校验的一种方式)

    我们的组件是什么呢 select distinct(id,title,price) from book ORM: model.py class Book(): title=model.CharFiel ...

  3. 这些HTML、CSS知识点,面试和平时开发都需要 No8-No9(知识点:媒体操作、构建表单)

    系列知识点汇总 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5-No7(知识 ...

  4. Asp.net mvc4 快速入门之构建表单

    1.asp.net mvc4  Index.cshtml页面上构建表单form的方式 @{ ViewBag.Title = "Index"; Layout = "~/Vi ...

  5. 【ASP.NET Web API教程】5.3 发送HTML表单数据:文件上传与多部分MIME

    原文:[ASP.NET Web API教程]5.3 发送HTML表单数据:文件上传与多部分MIME 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面 ...

  6. (转)WebApi发送HTML表单数据:文件上传与多部分MIME

    5.3 Sending HTML Form Data5.3 发送HTML表单数据(2) 本文引自:http://www.cnblogs.com/r01cn/archive/2012/12/20/282 ...

  7. WebApi发送HTML表单数据:文件上传与多部分MIME

    5.3 Sending HTML Form Data5.3 发送HTML表单数据(2) 本文引自:http://www.cnblogs.com/r01cn/archive/2012/12/20/282 ...

  8. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第四篇:传递表单数据

    摘要      本文将完成我们“MVC公告发布系统”的公告发布功能,以此展示在ASP.NET MVC中如何传递处理表单的数据. 前言      通过前几篇文章,我们已经能比较自如的使用ASP.NET ...

  9. Servlet的5种方式实现表单提交(注册小功能),后台获取表单数据

    用servlet实现一个注册的小功能 ,后台获取数据. 注册页面: 注册页面代码 : <!DOCTYPE html> <html> <head> <meta ...

随机推荐

  1. Mybatis开发中前端控制器注解@Controller 引用的类错误

    import org.springframework.web.portlet.ModelAndView; 错误 import org.springframework.web.servlet.Model ...

  2. idea2019.1 永久破解 亲测可用

    idea2019突然注册码突然失效了,搜了很多破解办法,这个还是有效的:https://www.jianshu.com/p/b6dd43618a66

  3. 在Linux下将HTML文件转换成PDF文件

    今天要写一个上交的作业,本来是想用Office Word来写的,但是,我的Office貌似不能用了,但是,Linux下的LibreOffice写出的文档,在打印的时候是经常出现乱码的.所以,后来想到可 ...

  4. 一波骚操作,我把 SQL 执行效率提高了 10,000,000 倍!

    作者:风过无痕-唐 http://www.cnblogs.com/tangyanbo/p/4462734.html 场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表: create  ...

  5. 【问题解决方案】关于Python中的语句 ' %matplotlib inline '

    跟进小项目#GirlsInAI#-可视化时遇到的语句,之前没有遇到过 在Stack Overflow上看到了一个解释: IPython有一组预定义的"魔术函数",您可以使用命令行样 ...

  6. JSTL 使用 c:forEach 累加变量值

    <body> <%    int x = 1;    int y = 2;    request.setAttribute("x", x);    request ...

  7. 三、SQL Server 对JSON的支持

    一.SQL Server 对JSON的支持 一.实现效果   现在 我用数据库是sql2008 ,共计2万数据. 每一条数据里面的有一个为attribute字段是 json存储状态属性,  我怎么查看 ...

  8. Kvm04 kvm虚拟机热迁移,可视化管理

    目录 1.kvm虚拟机热迁移 1). 冷迁移 修改配置文件,将定义的格式raw,改成qcow2格式! 修改完成,重启服务 2).热迁移 2.Virt-manager管理Kvm虚拟机 1.kvm虚拟机热 ...

  9. Codeforces 958C3 - Encryption (hard) 区间dp+抽屉原理

    转自:http://www.cnblogs.com/widsom/p/8863005.html 题目大意: 比起Encryption 中级版,把n的范围扩大到 500000,k,p范围都在100以内, ...

  10. Es学习第十课,ElasticSearch集群搭建

    前面几课我们已经把ES的基本概念和查询了解了,大家知道ES的核心优势就是天生支持分布式,所以,这课我们专门讲讲怎么搭建实现ES的集群部署. ES分布式原理 1.es分布式概念 主分片(Primary ...