django arya插件对数据库操作使用,reverse发娘解析url的使用
2017-11-27 15:28
579 查看
arya 项目01 (主要学习reverse方法,逆向解析url) 一、项目结构(只列出使用的文件) - learnmodelform 项目目录 - app01 第一个app model.py 数据库文件 arya.py 引用插件 - arya 第二个app apps.py 加载自动搜索模块,django启动时自动搜索该我文件配置的模块 - service arya逻辑文件目录 v1.py 逻辑代码文件,主要用来配置url,table表单展示数据,数据库操作等 - learnmodelform settings.py 配置文件 urls.py 路由文件 - templates 模板文件 model.py代码: from django.db import models # Create your models here. class Role(models.Model): caption = models.CharField(max_length=32) def __str__(self): return self.caption class UserType(models.Model): title = models.CharField(max_length=32) def __str__(self): return self.title class UserInfo(models.Model): name = models.CharField(max_length=32) pwd = models.CharField(max_length=32) email = models.CharField(max_length=32) ut = models.ForeignKey(to="UserType", blank=True,null=True) roles = models.ManyToManyField(to="Role",blank=True) def __str__(self): return self.name arya.py代码: from arya.service import v1 from . import models """ { models.UserInfo: AryaConfig(models.UserInfo,site), models.UserType: AryaConfig(models.UserType,site), } """ class UserInfoConfig(v1.AryaConfig): list_display = ['name', 'pwd', 'id', 'email'] v1.site.register(models.UserInfo,UserInfoConfig) class UserTypeConfig(v1.AryaConfig): list_display = ['id', 'title'] v1.site.register(models.UserType, UserTypeConfig) class RoleConfig(v1.AryaConfig): list_display = ['id', 'caption'] v1.site.register(models.Role,RoleConfig) apps.py代码(在arya应用中) from django.apps import AppConfig class AryaConfig(AppConfig): name = 'arya' def ready(self): from django.utils.module_loading import autodiscover_modules autodiscover_modules('arya') v1.py代码: from django.shortcuts import HttpResponse,render,redirect from django.utils.safestring import mark_safe from django.urls import reverse class AryaConfig(object): list_display = [] def get_list_display(self): result = [] result.extend(self.list_display) # 如果有编辑权限 #reslut=['name', 'pwd', 'id', 'email'] result.append(AryaConfig.row_edit) # 如果有删除权限 result.append(AryaConfig.row_del) result.insert(0, AryaConfig.row_checkbox) return result def row_del(self,row): # return row.name + row.email+str(row.id) # 生成删除URL # app01_userinfo_delete app = self.model_class._meta.app_label #app名 md = self.model_class._meta.model_name name = "arya:%s_%s_delete" %(app,md,) # arya:app01_userinfo_delete url = reverse(viewname=name, args=(row.id,)) #逆向解析url print(url) return mark_safe("<a href='{0}'>删除</a>".format(url)) def row_edit(self,row): # return row.name + row.email+str(row.id) # 生成编辑URL # app01_userinfo_change app = self.model_class._meta.app_label md = self.model_class._meta.model_name name = "arya:%s_%s_change" %(app, md,) # arya:app01_userinfo_change 必须按照这种格式,change是视图函数 url = reverse(viewname=name,args=(row.id,)) return mark_safe("<a href='{0}'>编辑</a>".format(url)) def row_checkbox(self,row): return mark_safe("<input type='checkbox' value='{0}' />".format(row.id)) def __init__(self, model_class,site): self.model_class = model_class self.site = site @property def urls(self): from django.conf.urls import url, include # self.model_class # UserInfo,UserGroup app = self.model_class._meta.app_label md = self.model_class._meta.model_name partterns = [ url(r'^$', self.changelist_view, name="%s_%s_list" %(app, md,)), url(r'^add/',self.add_view,name="%s_%s_add" %(app,md,)), url(r'^(\d+)/change/',self.change_view,name="%s_%s_change" %(app,md,)), url(r'^(\d+)/delete/',self.delete_view,name="%s_%s_delete" %(app,md,)), ] return partterns def changelist_view(self,request): """ 访问列表页面 self = AryaConfig对象1(UserInfo),model_class=UserInfo /userinfo/ /userinfo/add/ /userinfo/1/delete/ /userinfo/1/change/ self.model_class = UserInfo /usertype/ /usertype/add/ /usertype/1/delete/ /usertype/1/change/ self.model_class = UserType :param request: :return: """ table_data = [] queryset = self.model_class.objects.all() # [obj,obj,obj,obj] # list_display = ['name','pwd','email'] for obj in queryset: row = [] for str_func in self.get_list_display(): if isinstance(str_func,str): col = getattr(obj,str_func) else: col = str_func(self,obj) row.append(col) table_data.append(row) return render(request,'changelist.html',{'table_data': table_data}) def add_view(self,request): return HttpResponse('添加页面') def change_view(self,request,nid): # obj = self.model_class.objects.filter(id=nid).first() return HttpResponse('修改页面') def delete_view(self,request,nid): # self.model_class.objects.filter(id=nid).delete() return HttpResponse('删除页面') class AryaSite(object): def __init__(self): self._registry = {} def register(self, class_name, config_class): """ self._registry = { models.UserInfo: obj1 = AryaConfig(models.UserInfo,site), models.UserType: obj2 = AryaConfig(models.UserType,site), } :param class_name: :param config_class: :return: """ self._registry[class_name] = config_class(class_name,self) @property def urls(self): from django.conf.urls import url, include partterns = [ url(r'^login/', self.login), url(r'^logout/', self.logout), ] for model_class,arya_config_obj in self._registry.items(): app_model_name = r'^{0}/{1}/'.format(model_class._meta.app_label,model_class._meta.model_name) #/app名/模块名/ pt = url(app_model_name, (arya_config_obj.urls,None,None)) partterns.append(pt) return partterns def login(self,request): from django.shortcuts import HttpResponse return HttpResponse('Login') def logout(self,request): from django.shortcuts import HttpResponse return HttpResponse('Logout') site = AryaSite() urls.py代码: from django.conf.urls import url,include from django.contrib import admin from arya.service import v1 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'arya/', (v1.site.urls,None,'arya')), ] settings.py修改install_app 'arya.apps.AryaConfig', 'app01', changelist.html 模板代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table border="1"> {% for row in table_data %} <tr> {% for col in row %} <td>{{ col }}</td> {% endfor %} </tr> {% endfor %} </table> </body> </html> 二、ModelForm插件用法(其他代码参考一) views.py代码: from django.shortcuts import render,redirect # Create your views here. from django.forms import ModelForm from . import models class TestModelForm(ModelForm): class Meta: # model = models.UserInfo model = models.UserType fields = "__all__" def test(request): if request.method == "GET": obj = TestModelForm() return render(request,'test.html', {'obj':obj}) else: obj = TestModelForm(data=request.POST) if obj.is_valid(): obj.save() return redirect('/arya/app01/usertype/') return render(request,'test.html', {'obj':obj}) def edit(request,nid): # user_obj = models.UserInfo.objects.filter(id=nid).first() user_obj = models.UserType.objects.filter(id=nid).first() if request.method == 'GET': obj = TestModelForm(instance=user_obj) return render(request,'edit.html',{'obj':obj}) else: obj = TestModelForm(instance=user_obj,data=request.POST) if obj.is_valid(): obj.save() return redirect('/arya/app01/usertype/') return render(request, 'edit.html', {'obj':obj}) urls.py from django.conf.urls import url,include from django.contrib import admin from arya.service import v1 from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'arya/', (v1.site.urls,None,'arya')), url(r'^test/',views.test), url(r'^edit/(\d+)/',views.edit), ] test.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>添加页面</h1> <form method="POST" novalidate> {% csrf_token %} {{ obj.as_p }} <input type="submit" value="提交"> </form> </body> </html> edit.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>编辑页面</h1> <form method="POST" novalidate> {% csrf_token %} {{ obj.as_p }} <input type="submit" value="提交"> </form> </body> </html>
相关文章推荐
- Django学习笔记(四)Django使用操作数据库
- 配置好derby的环境变量后怎么在eclipse中使用derby插件来操作和管理相关的derby数据库
- Django 基础(一),项目创建、URL路由、数据库操作、模版
- Python的Django框架中使用SQLAlchemy操作数据库的教程
- 使用pgadmin3操作数据库 简介,误删数据表格后用Django重新生成表
- Django中url的逆向解析 -> Reverse resolution of URLs
- django操作数据库使用中文的方法
- Slatstack高级技巧(二) 使用django解析salt-api获取的信息插入数据库
- python2.0_day19_充分使用Django_form实现前端操作后台数据库
- PythonWeb开发Django框架学习(九)使用Model类操作数据库数据
- 如何在django中使用models.py对数据库进行操作
- Django使用Python操作数据库 --Django 1.8.2 文档(中文)部分笔记
- Python Django 中的STATIC_URL 设置和使用解析
- Python Django 中的STATIC_URL 设置和使用解析
- Django url 标签和reverse()函数的使用(转)
- Django使用表单操作数据库
- django-10-数据库使用04 后台安装配置及增加用户对数据库基本读写操作
- Django url反向解析 reverse()
- day03-spring与数据库操作的框架解析即dataSource的获取(JDBC)、使用spring中已经有的事务进行JDBC操作
- Python的Django框架中使用SQLAlchemy操作数据库的教程