django-groundwork

简介: 我的环境是windows7 + python34 + django1.8   下面两篇文章提到了django的scaffold,感觉是一个挺不错的功能: Django实战(3):Django也可以有scaffold Django1.5+Python3.3下groundwork的使用   于是去Github下载了django-groundwork(居然是四年以前更新过-_-!!!),解压后复制整个django-groundwork文件夹到当前项目文件夹下。

我的环境是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 form

    def __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 files

from .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 = 1

    try:
        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 os
    
class 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 config
        urls = URL_IMPORTS

        # Generate CRUD urls for each model
        for 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.py
        f = open( os.path.join (PROJECT_ROOT , app, 'urls.py') , 'w')
        f.write(urls)
        f.close()
        
        # append to root urlconf
        f = open( os.path.join(PROJECT_ROOT, PROJECT_NAME, 'urls.py'), 'a')
        f.write( PROJECT_URL_CONFIG % {'app': app } )
        f.close()



        # forms
        forms_content = FORMS_IMPORTS
        for 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()


        # views
        views_content = VIEWS_IMPORTS

        for model_instance in model_instances:
            views_content += VIEWS_CREATE 
            views_content += VIEWS_LIST
            views_content += VIEWS_VIEW
            views_content += VIEWS_UPDATE
            
            views_content = views_content %  {'model':model_instance._meta.object_name.lower(), 'modelClass': model_instance._meta.object_name, 'app': app } 

        # write to views.py
        viewspath = 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,并做了相应的修改。祝使用愉快!

 

目录
相关文章
|
4月前
|
搜索推荐 前端开发 数据可视化
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
172 1
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
|
4月前
|
机器学习/深度学习 数据采集 数据可视化
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
215 4
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
165 45
|
1月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
57 2
|
1月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
43 1
|
3月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
142 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
2月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
39 4
|
3月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
123 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
3月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
105 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
3月前
|
前端开发 搜索推荐 算法
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
中草药管理与推荐系统。本系统使用Python作为主要开发语言,前端使用HTML,CSS,BootStrap等技术和框架搭建前端界面,后端使用Django框架处理应用请求,使用Ajax等技术实现前后端的数据通信。实现了一个综合性的中草药管理与推荐平台。具体功能如下: - 系统分为普通用户和管理员两个角色 - 普通用户可以登录,注册、查看物品信息、收藏物品、发布评论、编辑个人信息、柱状图饼状图可视化物品信息、并依据用户注册时选择的标签进行推荐 和 根据用户对物品的评分 使用协同过滤推荐算法进行推荐 - 管理员可以在后台对用户和物品信息进行管理编辑
93 12
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发