django-groundwork
我的環(huán)境是windows7 + python34 + django1.8
?
下面兩篇文章提到了django的scaffold,感覺是一個(gè)挺不錯(cuò)的功能:
Django實(shí)戰(zhàn)(3):Django也可以有scaffold
Django1.5+Python3.3下groundwork的使用
?
于是去Github下載了django-groundwork(居然是四年以前更新過-_-!!!),解壓后復(fù)制整個(gè)django-groundwork文件夾到當(dāng)前項(xiàng)目文件夾下。
再設(shè)置settings.py:
INSTALLED_APPS = (# ...'django-groundwork', )然后運(yùn)行:
$ python manage.py groundwork depot Product?出現(xiàn)了如下錯(cuò)誤:
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官方文檔,發(fā)現(xiàn)django1.8的manage.py的命令行參數(shù)解析模塊已經(jīng)由optparse換成了argparse
所以,四年前寫的groundwork自然是不能運(yùn)行了。好吧,自己動(dòng)手,豐衣足食。
我把里面的兩個(gè)文件做了必要的修改:
# -------------------- # # 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?
保存,然后運(yùn)行:
$ python manage.py groundwork depot Product?
?不用再做任何修改,操作。啟動(dòng)服務(wù)器:
$ python manage.py runserver?在瀏覽器地址欄輸入:
localhost:8000/depot/product/list?
您會(huì)看到如下效果圖:
?點(diǎn)擊 Add New,進(jìn)入create頁面
?最后為了方便大家使用,我Fork了原來的django-groundwork到我的Github,并做了相應(yīng)的修改。祝使用愉快!
?
總結(jié)
以上是生活随笔為你收集整理的django-groundwork的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: org.tinygroup.databa
- 下一篇: SICP 1.20经验