django-groundwork个人1.5.3修改版

django-groundwork,它不实现具体的功能,而是扩展了manage.py 的命令,使得通过命令行可以生成一些代码/文件。根据你的模型自动生成模板、view、url等。 将下载好的groundwork放到与APP同级的目录,在setting.py 中添加'django-groundwork'

网上流传的都不太适合我使用的1.5.3版本,所以个人对其进行了小修改。

groundwork.py:

from django.core.management.base import BaseCommand, CommandError
from django.db import models
from placeholders import *
import os
class Command(BaseCommand):
    def handle(self, *args, **options):
        "Usage : manage.py groundwork <app> <model>"
        PROJECT_ROOT = os.getcwd()+r'/'+args[0]
        PROJECT_MROOT = os.getcwd()
        TEMPLATE_DIR = os.path.join ( PROJECT_ROOT , 'templates')
        print PROJECT_ROOT
        print TEMPLATE_DIR
        try:
            app = args[1] # App name is the first parameter

            model_names = args[2:] # Models which need to be scaffolded will follow

            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_MROOT , app, 'urls.py') , 'w')
            f.write(urls)
            f.close()
            # append to root urlconf

            f = open( os.path.join (PROJECT_ROOT , 'urls.py') , 'a')
            f.write( "nurlpatterns += patterns ('',n (r'^%(app)s/', include('%(app)s.urls')),n)n" % {'app': app } )
            f.close()
            # forms

            forms_content = FORMS_IMPORTS
            print forms_content
            for model_instance in model_instances:
                forms_content += FORMS_MODELFORM_CONFIG % { 'modelClass' : model_instance._meta.object_name }
            formspath = os.path.join (PROJECT_MROOT, 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_MROOT, 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)
            print "Generate base template? [Y/N]?"
            yn = raw_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()
            # settings

            f = open(os.path.join(PROJECT_ROOT, 'settings.py'), 'a')
            f.write( "nimport osnTEMPLATE_DIRS += (os.path.join(  os.path.dirname(__file__), 'templates') ,)n")
            f.close()
        except:
            print "Usage : manage.py groundwork <app> <model>"

placeholders.py(1.5以后版本<herf url后面的view必须用引号引起来):

URL_IMPORTS = """
from django.conf.urls.defaults import *
from models import *
from views import *
urlpatterns = patterns('',
"""
URL_CRUD_CONFIG = """
    (r'%(model)s/create/$', create_%(model)s),
    (r'%(model)s/list/$', list_%(model)s ),
    (r'%(model)s/edit/(?P<id>[^/]+)/$', edit_%(model)s),
    (r'%(model)s/view/(?P<id>[^/]+)/$', 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 %%} <h1> %(modelClass)s </h1><h2> List </h2> {%% 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.views.view_%(model)s" item.id %%}">Show</a> </td> <td><a href="{%% url "%(app)s.views.edit_%(model)s" item.id %%}">Edit</a></tr>
{%% endfor %%}
<tr><td colspan="3"> <a href="{%% url "%(app)s.views.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 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
        <meta http-equiv="content-type" content="text/html; 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>
"""

安装后,使用python manage.py help可以看到,列出的可用命令中多了一个groundwork。其语法是:

python manage.py groundwork appname ModelName1 ModelName2

修改后:

python manage.py groundwork projectname appname ModelName1 ModelName2

此时运行开发服务器(python manage.py runserver),就可以访问下面的地址:

http://localhost:8000/appname/ModelName/list/ 访问ModelName列表,并链接到create,edit,view等界面。

注意,用此APP需要先定义好模型,否则后面每次使用时候都会在setting.py中添加冗余数据。