我的环境是windows7 + python34 + django1.8

下面两篇文章提到了django的scaffold,感觉是一个挺不错的功能:

Django实战(3):Django也可以有scaffold

Django1.5+Python3.3下groundwork的使用

于是去Github下载了django-groundwork(居然是四年以前更新过-_-!!!),解压后复制整个django-groundwork文件夹到当前项目文件夹下。

再设置settings.py:

INSTALLED_APPS = (# ...'django-groundwork',
)

然后运行:

$ python manage.py groundwork depot Product

出现了如下错误:

E:\workspace\depot>python manage.py groundwork depotapp Product
usage: manage.py groundwork [-h] [--version] [-v {0,1,2,3}]
[--settings SETTINGS] [--pythonpath PYTHON
[--traceback] [--no-color]
manage.py groundwork: error: unrecognized arguments: depotapp Product

查看django官方文档,发现django1.8的manage.py的命令行参数解析模块已经由optparse换成了argparse

所以,四年前写的groundwork自然是不能运行了。好吧,自己动手,丰衣足食。

我把里面的两个文件做了必要的修改:

# -------------------- #
# project/urls.py file section #
# -------------------- #

PROJECT_URL_CONFIG = """
"\nurlpatterns += [url(r'^%(app)s/', include('%(app)s.urls', namespace='%(app)s')),\n]\n"
"""# -------------------- #
# urls.py file section #
# -------------------- #
URL_IMPORTS = """
from django.conf.urls import url
from .models import *
from .views import *urlpatterns =[
"""URL_CRUD_CONFIG = """url(r'^%(model)s/create/$', create_%(model)s, name='create_%(model)s'),url(r'^%(model)s/list/$', list_%(model)s, name='list_%(model)s'),url(r'^%(model)s/edit/(?P<id>[^/]+)/$', edit_%(model)s, name='edit_%(model)s'),url(r'^%(model)s/view/(?P<id>[^/]+)/$', view_%(model)s, name='view_%(model)s'),""" URL_END = """
]
"""# --------------------- #
# forms.py file section #
# --------------------- #

FORMS_IMPORTS = """
from django import forms
from .models import *"""FORMS_MODELFORM_CONFIG = """class %(modelClass)sForm(forms.ModelForm):class Meta:model = %(modelClass)s    exclude = [] # uncomment this line and specify any field to exclude it from the formdef __init__(self, *args, **kwargs):super(%(modelClass)sForm, self).__init__(*args, **kwargs)"""        # --------------------- #
# views.py file section #
# --------------------- #

VIEWS_IMPORTS = """
# Create your views here.from django import forms
from django.template import RequestContext
from django.http import HttpResponse, HttpResponseRedirect
from django.template.loader import get_template
from django.core.paginator import Paginator
from django.core.urlresolvers import reverse# app specific filesfrom .models import *
from .forms import *
"""VIEWS_CREATE = """def create_%(model)s(request):form = %(modelClass)sForm(request.POST or None)if form.is_valid():form.save()form = %(modelClass)sForm()t = get_template('%(app)s/create_%(model)s.html')c = RequestContext(request,locals())return HttpResponse(t.render(c))"""VIEWS_LIST = """def list_%(model)s(request):list_items = %(modelClass)s.objects.all()paginator = Paginator(list_items ,10)try:page = int(request.GET.get('page', '1'))except ValueError:page = 1try:list_items = paginator.page(page)except :list_items = paginator.page(paginator.num_pages)t = get_template('%(app)s/list_%(model)s.html')c = RequestContext(request,locals())return HttpResponse(t.render(c))"""VIEWS_UPDATE = """
def edit_%(model)s(request, id):%(model)s_instance = %(modelClass)s.objects.get(id=id)form = %(modelClass)sForm(request.POST or None, instance = %(model)s_instance)if form.is_valid():form.save()t=get_template('%(app)s/edit_%(model)s.html')c=RequestContext(request,locals())return HttpResponse(t.render(c))
"""VIEWS_VIEW = """def view_%(model)s(request, id):%(model)s_instance = %(modelClass)s.objects.get(id = id)t=get_template('%(app)s/view_%(model)s.html')c=RequestContext(request,locals())return HttpResponse(t.render(c))
"""# ------------------------- #
# templates.py file section #
# ------------------------- #
TEMPLATES_CREATE = """
{%% extends "base.html" %%}{%% block title %%} %(modelClass)s - Create {%% endblock %%}{%% block heading %%}<h1>  %(modelClass)s - Create </h1>  {%% endblock %%}{%% block content %%}
<table>
<form action="" method="POST"> {%% csrf_token %%}{{form}}<tr><td colspan="2" align="right"><input type="submit" value="Create"/></td></tr>
</form>
</table>
{%% endblock %%}
"""TEMPLATES_LIST = """
{%% extends "base.html" %%}{%% block title %%}  %(modelClass)s -- List {%% endblock %%}{%% block heading %%}
<h1> %(modelClass)s</h1>
<h2> List Records</h2>
{%% endblock %%}
{%% block content %%} <table>
<thead>
<tr><th>Record</th><th colspan="3">Actions</th></tr>
{%% for item in list_items.object_list %%}<tr><td>  {{item}}</td> <td><a href="{%% url '%(app)s:view_%(model)s' item.id %%}">Show</a> </td> <td><a href="{%% url '%(app)s:edit_%(model)s' item.id %%}">Edit</a></tr>
{%% endfor %%}
<tr><td colspan="3"> <a href="{%% url '%(app)s:create_%(model)s' %%}">Add New</a></td></tr>
</table><div align="center">
{%% if list_items.has_previous %%}<a href="?page={{ list_items.previous_page_number }}">Previous</a>
{%% endif %%}<span class="current">Page {{ list_items.number }} of {{ list_items.paginator.num_pages }}.
</span>{%% if list_items.has_next %%}<a href="?page={{ list_items.next_page_number }}">Next</a>
{%% endif %%}</div>
{%% endblock %%}
"""TEMPLATES_EDIT = """
{%% extends "base.html" %%}{%% block title %%} %(modelClass)s - Edit {%% endblock %%}{%% block heading %%} <h1> %(modelClass)s</h1><h2> Edit </h2> {%% endblock %%}
{%% block content %%}
<table>
<form action="" method="POST"> {%% csrf_token %%}{{form}}<tr><td colspan="2" align="right"><input type="submit" value="Save"/></td></tr>
</form>
</table>
{%% endblock %%}
"""TEMPLATES_VIEW = """
{%% extends "base.html" %%}{%% block title %%} %(modelClass)s - View {%% endblock %%}{%% block heading %%} <h1> %(modelClass)s</h1><h2>View</h2>  {%% endblock %%}
{%% block content %%}
<table>
{{ %(model)s_instance }}
</table>
{%% endblock %%}
"""TEMPLATES_BASE = """
<!DOCTYPE html>
<html>
<head><meta charset=UTF-8"/><meta name="description" content=""/><meta name="keywords" content="" /><meta name="author" content="" /><title>{% block title %} {% endblock %}</title><style type="text/css"> html * { padding:0; margin:0; }body * { padding:10px 20px; }body * * { padding:0; }body { font:small sans-serif; }body>div { border-bottom:1px solid #ddd; }h1 { font-weight:normal; }h2 { margin-bottom:.8em; }h2 span { font-size:80% ; color:#666; font-weight:normal; }h3 { margin:1em 0 .5em 0; }h4 { margin:0 0 .5em 0; font-weight: normal; }td {font-size:1em;  padding:3px 17px 2px 17px;}ul { margin-left: 2em; margin-top: 1em; }#summary { background: #e0ebff; }#summary h2 { font-weight: normal; color: #666; }#explanation { background:#eee; }#content { background:#f6f6f6; }#summary table { border:none; background:transparent; }</style>
</head>
<body><div id="summary">
{% block heading %}
{% endblock %}
</div><div id="content">
{% block content %} {% endblock %}
</div><div id="explanation" align="center">
django-groundwork
</div></body>
</html>
"""

placeholder.py

from django.core.management.base import BaseCommand, CommandError
from django.db import models
from .placeholders import *
import osclass Command(BaseCommand):help = "Usage : manage.py groundwork <app> <model>"def add_arguments(self, parser):parser.add_argument('app', nargs='+', type=str)parser.add_argument('model', nargs='+', type=str)def handle(self, *args, **options):"Usage : manage.py groundwork <app> <model>"app = options['app'][0]model_names = options['model']PROJECT_ROOT = os.getcwd() PROJECT_NAME = os.path.basename(PROJECT_ROOT)TEMPLATE_DIR = os.path.join(PROJECT_ROOT , app, 'templates')model_instances = [ models.get_model(app, x) for x in model_names ]# url configurls = URL_IMPORTS# Generate CRUD urls for each modelfor model_instance in model_instances:urls += URL_CRUD_CONFIG % {'model':model_instance._meta.object_name.lower(), 'modelClass': model_instance._meta.object_name } urls += URL_END# write to urls.pyf = open( os.path.join (PROJECT_ROOT , app, 'urls.py') , 'w')f.write(urls)f.close()# append to root urlconff = open( os.path.join(PROJECT_ROOT, PROJECT_NAME, 'urls.py'), 'a')f.write( PROJECT_URL_CONFIG % {'app': app } )f.close()# formsforms_content = FORMS_IMPORTSfor model_instance in model_instances:forms_content += FORMS_MODELFORM_CONFIG % { 'modelClass' : model_instance._meta.object_name }formspath = os.path.join (PROJECT_ROOT, app, 'forms.py')f = open( formspath , 'w')f.write(forms_content)f.close()# viewsviews_content = VIEWS_IMPORTSfor model_instance in model_instances:views_content += VIEWS_CREATE views_content += VIEWS_LISTviews_content += VIEWS_VIEWviews_content += VIEWS_UPDATEviews_content = views_content %  {'model':model_instance._meta.object_name.lower(), 'modelClass': model_instance._meta.object_name, 'app': app } # write to views.pyviewspath = os.path.join (PROJECT_ROOT, app, 'views.py')f = open( viewspath, 'w')f.write(views_content)f.close()# Templates
        template_dir = os.path.join(TEMPLATE_DIR, app )if not os.path.exists(template_dir):os.makedirs(template_dir)self.stdout.write("Generate base template? [Y/N]?")yn = input()if yn.lower() == 'y':f = open(os.path.join(TEMPLATE_DIR, 'base.html') , 'w')f.write(TEMPLATES_BASE)f.close()for model_instance in model_instances:f = open(os.path.join( TEMPLATE_DIR, app, 'create_%s.html' % (model_instance._meta.object_name.lower()) ) ,'w')f.write( TEMPLATES_CREATE  %  { 'modelClass' : model_instance._meta.object_name } )f.close()f = open(os.path.join( TEMPLATE_DIR, app, 'list_%s.html' % (model_instance._meta.object_name.lower()) ) ,'w')f.write( TEMPLATES_LIST  %  { 'modelClass' : model_instance._meta.object_name ,'model' : model_instance._meta.object_name.lower(), 'app' : app} )f.close()f = open(os.path.join( TEMPLATE_DIR, app, 'edit_%s.html' % (model_instance._meta.object_name.lower()) ) ,'w') f.write( TEMPLATES_EDIT  %  { 'modelClass' : model_instance._meta.object_name } )f.close()f = open(os.path.join( TEMPLATE_DIR, app, 'view_%s.html' % (model_instance._meta.object_name.lower()) ) , 'w')f.write( TEMPLATES_VIEW  %  { 'modelClass' : model_instance._meta.object_name,  'model' : model_instance._meta.object_name.lower()} )f.close()

groundwork.py

保存,然后运行:

$ python manage.py groundwork depot Product

不用再做任何修改,操作。启动服务器:

$ python manage.py runserver

在浏览器地址栏输入:

localhost:8000/depot/product/list

您会看到如下效果图:

点击 Add New,进入create页面

最后为了方便大家使用,我Fork了原来的django-groundwork到我的Github,并做了相应的修改。祝使用愉快!

django-groundwork相关推荐

  1. Django Python Web应用程序框架简介

    在这个由四部分组成的系列文章的前三篇文章中,比较了不同的Python Web框架,我们介绍了Pyramid , Flask和Tornado Web框架. 我们已经构建了同一个应用程序3次,最终进入了D ...

  2. Django学习之路(一)--初识django

    1.先创建虚拟环境 为什么要创建虚拟环境呢? 你有两个项目同时进行,一个需要pytnon3.9和Django3.x版本的,一个需要python3.7和Django2.x版本的,不进行环境隔离的话,运行 ...

  3. django自带的分页功能

    django自带的分页功能 django中自带的分页功能有缺陷,但是也是一种思路,所以在下做一个整理,方便以后使用,还有服务各位小伙伴. django视图部分的代码.(注释才是重点) from dja ...

  4. django正反向查询

    django正反向查询 当我们的表存在外键想要从一找多的时候该怎么查找,当我们从多找一的时候又应该怎么查找. 一找多 首先我们要创建一个项目,在项目的model.py中创建两个模型. from dja ...

  5. Django 布署6.5

    布署 从uwsgi.nginx.静态文件三个方面处理 服务器介绍 服务器:私有服务器.公有服务器 私有服务器:公司自己购买.自己维护,只布署自己的应用,可供公司内部或外网访问 公有服务器:集成好运营环 ...

  6. Django 全文检索6.3

    全文检索 全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理 haystack:django的一个包,可以方便地对model里面的内容进行索引.搜索,设计为支持wh ...

  7. Django 缓存6.2

    缓存 对于中等流量的网站来说,尽可能地减少开销是必要的.缓存数据就是为了保存那些需要很多计算资源的结果,这样的话就不必在下次重复消耗计算资源 Django自带了一个健壮的缓存系统来保存动态页面,避免对 ...

  8. Django 第三方引用富文本编辑器6.1

    借助富文本编辑器,管理员能够编辑出来一个包含html的页面,从而页面的显示效果,可以由管理员定义,而不用完全依赖于前期开发人员 此处以tinymce为例,其它富文本编辑器的使用可以自行学习 使用编辑器 ...

  9. Django 分页和使用Ajax5.3

    分页 Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中 Paginator对象 Paginator(列表,int):返回分页对象,参数为列表数据, ...

  10. Django 上传图片和Admin站点5.2

    上传图片 当Django在处理文件上传的时候,文件数据被保存在request.FILES FILES中的每个键为<input type="file" name="& ...

最新文章

  1. 使用Windows Live Writer发布日志
  2. 二十六、爬取拉钩网Python职位的数据
  3. autosys start_mins
  4. python语法详解_解析 Python3 基础语法
  5. Docker 三剑客之 Docker Compose
  6. 软件工程(2018)第四次团队作业
  7. 上传网站到服务器的tomcat
  8. tensorflow学习笔记(1)如何高效地学习TensorFlow(附链接)
  9. android自定义多按钮点击事件监听事件吗,安卓(Android)动态创建多个按钮并添加监听事件...
  10. zemax操作例子_光学软件使用实例:从Zemax导入光学系统
  11. pgsql截取字符串函数_postgresql——字符串函数
  12. Nvidia Jetson AGX Xavier 安装 Swin-Transformer-Object-Detection
  13. SpringBoot2.0系列教程(四)Springboot框架自定义消息转换器
  14. 苹果拼图软件测试,装机必备软件评测:DSM记事本iPhone版
  15. 神仙道玄奇套装材料大全
  16. 图灵超算工作站UltraLAB GT400M上市
  17. 孙子兵法与三十六计 复盘短记
  18. openGauss+KeepAlived(故障转移)
  19. 以太坊虚拟机动态数据类型的表示方法
  20. 小米路由器提示网络连接问题

热门文章

  1. ML:自然语言处理NLP面试题
  2. 插件~Nuget中包与包的依赖关系
  3. ubuntu下svn使用指南
  4. OCS Inventory NG使用之在windows 2008 R2平台下安装服务器端(二)
  5. 第三十五讲:tapestry Ajax zone组件无黄色闪烁的背景
  6. LogMiner Tool
  7. 2022年4月8日体检
  8. mysql中的各种join整理
  9. hadoop+hive+flink+hbase交互的版本兼容性
  10. Flink中MapFunction以及其他各种xxxFunction在intellij中的用法和规律