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
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
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)
result.append(AryaConfig.row_edit)
result.append(AryaConfig.row_del)
result.insert(
0
, AryaConfig.row_checkbox)
return
result
def
row_del(
self
,row):
app
=
self
.model_class._meta.app_label
md
=
self
.model_class._meta.model_name
name
=
"arya:%s_%s_delete"
%
(app,md,)
url
=
reverse(viewname
=
name, args
=
(row.
id
,))
print
(url)
return
mark_safe(
"<a href='{0}'>删除</a>"
.
format
(url))
def
row_edit(
self
,row):
app
=
self
.model_class._meta.app_label
md
=
self
.model_class._meta.model_name
name
=
"arya:%s_%s_change"
%
(app, md,)
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
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):
table_data
=
[]
queryset
=
self
.model_class.objects.
all
()
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):
return
HttpResponse(
'修改页面'
)
def
delete_view(
self
,request,nid):
return
HttpResponse(
'删除页面'
)
class
AryaSite(
object
):
def
__init__(
self
):
self
._registry
=
{}
def
register(
self
, class_name, config_class):
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)
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
from
django.forms
import
ModelForm
from
.
import
models
class
TestModelForm(ModelForm):
class
Meta:
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.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>