├── .hgignore ├── .hgtags ├── README.md ├── djangocrudgenerator ├── README ├── __init__.py ├── config │ ├── __init__.py │ └── settings.py ├── management │ ├── __init__.py │ └── commands │ │ ├── __init__.py │ │ ├── crudgen.py │ │ └── tests.py ├── models.py ├── templates │ ├── model_confirm_delete.html │ ├── model_form.html │ ├── model_list.html │ ├── only_for_testing_dont_override.txt │ ├── urls.py │ └── views.py ├── templatetags │ ├── .generatortags.py.swn │ ├── __init__.py │ ├── generatortags.py │ └── tests.py └── tests.py ├── examples ├── exampleproject_01 │ ├── README │ ├── __init__.py │ ├── manage.py │ ├── settings.py │ ├── testdb.dat │ ├── urls.py │ └── yourwebapp │ │ ├── __init__.py │ │ ├── models.py │ │ ├── tests.py │ │ └── views.py ├── exampleproject_02 │ ├── README │ ├── __init__.py │ ├── manage.py │ ├── settings.py │ ├── templates │ │ └── djangocrudgenerator │ │ │ ├── model_confirm_delete.html │ │ │ ├── model_form.html │ │ │ ├── model_list.html │ │ │ ├── urls.py │ │ │ └── views.py │ ├── testdb.dat │ ├── urls.py │ └── yourwebapp │ │ ├── __init__.py │ │ ├── models.py │ │ ├── tests.py │ │ └── views.py └── exampleproject_03 │ ├── README │ ├── __init__.py │ ├── manage.py │ ├── settings.py │ ├── templates │ └── djangocrudgenerator │ │ ├── forms.py │ │ ├── model_confirm_delete.html │ │ ├── model_form.html │ │ ├── model_list.html │ │ ├── urls.py │ │ └── views.py │ ├── testdb.dat │ ├── urls.py │ └── yourwebapp │ ├── __init__.py │ ├── models.py │ ├── tests.py │ └── views.py └── setup.py /.hgignore: -------------------------------------------------------------------------------- 1 | # use glob syntax. 2 | syntax: glob 3 | 4 | *.pyc 5 | *.swp 6 | *.swo 7 | *~ 8 | 9 | # switch to regexp syntax. 10 | syntax: regexp 11 | ^\.pc/ 12 | -------------------------------------------------------------------------------- /.hgtags: -------------------------------------------------------------------------------- 1 | 125c1e07dad0e87c10f4827f163869507ee9e1c8 vesion-0.4 2 | 7891ecb836ac9fd14b0d0142571cac0621a47e65 help 3 | 7891ecb836ac9fd14b0d0142571cac0621a47e65 help 4 | 0000000000000000000000000000000000000000 help 5 | 125c1e07dad0e87c10f4827f163869507ee9e1c8 vesion-0.4 6 | 0000000000000000000000000000000000000000 vesion-0.4 7 | b795261e9a92009c2f67f49d911acf262a22a29d version-0.4 8 | 18734f7ce1bbcc5f8f5a5cc8b7b375fb1cdeb705 version-0.6 9 | b795261e9a92009c2f67f49d911acf262a22a29d version-0.4 10 | 0000000000000000000000000000000000000000 version-0.4 11 | 18734f7ce1bbcc5f8f5a5cc8b7b375fb1cdeb705 version-0.6 12 | 0000000000000000000000000000000000000000 version-0.6 13 | f9f83513bf75194b4ae6768944c7ea706cb7f3b7 version-0.0.7 14 | 0000000000000000000000000000000000000000 help 15 | 77a46caae978381f30c9506362d3cfda1b035be3 help 16 | 77a46caae978381f30c9506362d3cfda1b035be3 help 17 | 0000000000000000000000000000000000000000 help 18 | 5504b5b4c5db033e5b331b6093e330c47f6ee30f version-0.0.8 19 | 3f9bdd6a33cb1567beddf9ca82ee5c6dc2d3473a version-0.0.9 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### Setup: 2 | 3 | * Installation: 4 | ``` 5 | $ pip install -e git+git@github.com:jaanauati/django-crud-generator.git@master#egg=django-crud-generator 6 | ``` 7 | * Add 'djangocrudgenerator' to the installed apps. 8 | ``` 9 | INSTALLED_APPS = ( 10 | ... 11 | 'yourwebapp', 12 | 'djangocrudgenerator', 13 | ... 14 | ) 15 | ``` 16 | 17 | ### USAGE: 18 | 19 | * Supposing that you have created an application named 'yourwebapp', add the following to the project urlconf file (urls.py): 20 | ``` 21 | urlpatterns = patterns('', 22 | ... 23 | url(r'^yourwebapp/', include('yourwebapp.urls',namespace="yourwebapp")), 24 | ... 25 | ) 26 | ``` 27 | It's also necessary to include the templates directory of your application in the settings file: 28 | ``` 29 | TEMPLATE_DIRS = ( 30 | ... 31 | 'path/to/yourwebapp/templates', 32 | ) 33 | ``` 34 | * Add an example model to the 'yourwebapp' app: 35 | ``` 36 | #models.py 37 | class YourModel(models.Model): 38 | name=models.CharField(max_length=30) 39 | ... 40 | def __str__(self): 41 | return self.name 42 | ``` 43 | * Now you can use the crud generator. For example, if you want generate a CRUD for the 'YourModel' model, you must run the following command: 44 | ``` 45 | $ python manage.py crudgen yourwebapp YourModel 46 | ``` 47 | * To test the generated CRUD, first you must run the django development server: 48 | ``` 49 | $ python manage.py runserver 50 | ``` 51 | and then, go to http://localhost:8000/yourwebapp/yourmodel/list/page1/ in your web browser. 52 | 53 | Enjoy! 54 | -------------------------------------------------------------------------------- /djangocrudgenerator/README: -------------------------------------------------------------------------------- 1 | INSTALL: 2 | 3 | Just run: 4 | $ python setup.py install 5 | 6 | Usage: 7 | Steps: 8 | 1. First you must add the 'crudgenerator' into the settings file: 9 | INSTALLED_APPS=( 10 | ... 11 | 'yourwebapp', 12 | 'crudgenerator', 13 | ... 14 | ) 15 | - Supposing that your application name is 'yourwebapp', add the following 16 | to your urlconf file (urls.py): 17 | urlpatterns = patterns('', 18 | ... 19 | url(r'^yourwebapp/', include('yourwebapp.urls',namespace="yourwebapp")), 20 | ... 21 | ) 22 | - Add a model to the app 'yourwebapp': 23 | #models.py 24 | class YourModel(models.Model): 25 | ... 26 | and then run the syncdb util. 27 | - Right now, you should use the crud generator. In example, if you want generate 28 | the 'YourModel' CRUD, so run the following statement: 29 | $ python manage.py crudgen yourwebapp YourCustomModel 30 | - Test the CRUD: 31 | $ python manage.py runserver 32 | go to http://localhost:8000/yourwebapp/yourmodel/list/page1/ in your browser 33 | and ejoy you autogenerated CRUD. 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /djangocrudgenerator/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaanauati/django-crud-generator/c2f7ebd08267a1a950532f2a2368eb2f55177a8f/djangocrudgenerator/__init__.py -------------------------------------------------------------------------------- /djangocrudgenerator/config/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | from settings import DJANGOCRUDGENERATOR_SETTINGS 5 | -------------------------------------------------------------------------------- /djangocrudgenerator/config/settings.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | """ 5 | Configuration file of the generator. 6 | Important note: The groups 'appname' and 'modelname' will be expanded to 7 | the application and model name. 8 | """ 9 | DJANGOCRUDGENERATOR_SETTINGS = { 10 | "files": [ 11 | { 12 | "template": "model_form.html", 13 | "name": "${appname}/templates/${appname}/" + 14 | "${modelname_lower}_form.html", 15 | "override": True, 16 | }, 17 | { 18 | "template": "model_confirm_delete.html", 19 | "name": "${appname}/templates/${appname}/" + 20 | "${modelname_lower}_confirm_delete.html", 21 | "override": True, 22 | }, 23 | { 24 | "template": "model_list.html", 25 | "name": "${appname}/templates/${appname}/" + 26 | "${modelname_lower}_list.html", 27 | "override": True, 28 | }, 29 | { 30 | "template": "views.py", 31 | "name": "${appname}/views.py", 32 | "override": False, 33 | }, 34 | { 35 | "template": "urls.py", 36 | "name": "${appname}/urls.py", 37 | "override": False, 38 | }, 39 | ] 40 | } 41 | -------------------------------------------------------------------------------- /djangocrudgenerator/management/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /djangocrudgenerator/management/commands/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /djangocrudgenerator/management/commands/crudgen.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | 3 | 4 | from django.conf import settings 5 | from django.core.management.base import BaseCommand, CommandError 6 | from django.template import loader, Context 7 | from django.template.loader import get_template, select_template 8 | from django import template 9 | from django.contrib.contenttypes.models import ContentType 10 | 11 | from djangocrudgenerator.config.settings import DJANGOCRUDGENERATOR_SETTINGS 12 | try: 13 | DJANGOCRUDGENERATOR_SETTINGS = settings.DJANGOCRUDGENERATOR_SETTINGS 14 | except AttributeError: 15 | pass 16 | 17 | import os 18 | import time 19 | from string import Template 20 | import djangocrudgenerator 21 | 22 | 23 | class ModelCRUDGenerator(object): 24 | """ Generator helper.""" 25 | 26 | def __init__(self, settings, appname, modelname): 27 | """Initializes an ModelCRUDGenerator instance. 28 | - appname: the target application. 29 | - modelname: the target model. 30 | If either the application is invalid or the model `modelname` does 31 | not exist inside the `models.py` file of the application, an 32 | `CommandError` will be raised. 33 | """ 34 | model = self.get_model(appname, modelname) 35 | if not model: 36 | raise CommandError("Invalid parameters: %s %s.\nRemember that the " 37 | "target application must be in the " 38 | "INSTALLED_APPS." % (appname, modelname)) 39 | self.settings = settings 40 | self.model = model 41 | self.appname = appname 42 | self.modelname = modelname 43 | 44 | @classmethod 45 | def get_model(cObj, appname, modelname): 46 | """ Returns the`modelname` class object. If either the application or 47 | the model is invalid, then `None` is returned. 48 | """ 49 | #try: 50 | # module=__import__(appname) 51 | # model = getattr(getattr(module,'models'), modelname) 52 | # return model 53 | #except Exception, ex: 54 | # return None 55 | try: 56 | ctype = ContentType.objects.get(app_label=appname.lower(), 57 | model=modelname.lower()) 58 | return ctype.model_class() 59 | except Exception, ex: 60 | return None 61 | 62 | @classmethod 63 | def get_crudgen_dir(cObj): 64 | """ Returns the installation directory of djangocrudgenerator. """ 65 | return os.path.dirname(djangocrudgenerator.__file__) 66 | 67 | @classmethod 68 | def gen_template_name(cObj, name): 69 | return 'djangocrudgenerator/'+name 70 | 71 | @classmethod 72 | def get_template(cObj, templ_name, alternative_tmpl): 73 | """ Finds the given template, the user can override the 74 | djangocrudgenerator self-contained template via the templates 75 | directories ("templates/djangocrudgenerator"). 76 | An Template instance will be returned. 77 | """ 78 | return select_template([cObj.gen_template_name(templ_name), 79 | alternative_tmpl]) 80 | 81 | @classmethod 82 | def render_template(cObj, template_name, context_data): 83 | """ This method renders the template with the given context data and 84 | returns the result.""" 85 | templ_fullpath_alternative = "%s/%s" % (cObj.get_crudgen_dir() + 86 | "/templates", 87 | template_name) 88 | template = cObj.get_template(template_name, 89 | templ_fullpath_alternative) 90 | return template.render(Context(context_data)) 91 | 92 | @classmethod 93 | def create_dirs(cObj, pathname): 94 | head, tail = os.path.split(pathname) 95 | if tail: 96 | if head: 97 | cObj.create_dirs(head) 98 | try: 99 | os.mkdir(os.path.join(head, tail)) 100 | except Exception, ex: 101 | if ex[0] != 17: 102 | raise ex 103 | 104 | def generate_files(self): 105 | results = {'generated': [], 'backup': []} 106 | try: 107 | for f in self.settings['files']: 108 | template = f['template'] 109 | context_data = { 110 | 'modelname': self.modelname, 111 | 'modelname_lower': self.modelname.lower(), 112 | 'appname': self.appname, 113 | 'template': template 114 | } 115 | raw_name = f['name'] 116 | override = f.get('override', False) 117 | backup = f.get('backup', bool(override)) 118 | full_name = Template(raw_name).substitute(**context_data) 119 | self.create_dirs(os.path.split(full_name)[0]) 120 | contents = self.render_template(template, context_data) 121 | if backup: 122 | backup_name = full_name+"."+str(int(time.time())) 123 | try: 124 | srcfile = file(full_name) 125 | backupfile = file(backup_name, "w") 126 | backupfile.write(srcfile.read()) 127 | backupfile.close() 128 | srcfile.close() 129 | results['backup'].append(backup_name) 130 | except IOError: 131 | pass 132 | else: 133 | print("Created Backup: %s" % backup_name) 134 | if override: 135 | flags = "w" 136 | else: 137 | flags = "a+" 138 | output = file(full_name, flags) 139 | output.write(contents.encode('utf-8')) 140 | output.close() 141 | results['generated'].append(full_name) 142 | print("Generated: %s" % full_name) 143 | return results 144 | except KeyError: 145 | raise CommandError("Invalid configuration.") 146 | 147 | 148 | class Command(BaseCommand): 149 | args = '' 150 | help = 'Generates a C.R.U.D. for the selected application model.' 151 | 152 | def handle(self, *args, **options): 153 | try: 154 | appname = args[0] 155 | modelname = args[1] 156 | except: 157 | raise CommandError("Invalid paramters.") 158 | ModelCRUDGenerator(DJANGOCRUDGENERATOR_SETTINGS, appname, modelname) \ 159 | .generate_files() 160 | self.printSuccessLeyends(appname, modelname) 161 | 162 | def printSuccessLeyends(self, appname, modelname): 163 | t = Template("url(r'^${appname}/', include('${appname}.urls'," 164 | "namespace='${appname}'))") 165 | cdata = {'appname': appname, 'modelname': modelname} 166 | leyend = t.substitute(**cdata) 167 | self.stdout.write('%s.%s CRUD successfully generated.\n' % (appname, 168 | modelname)) 169 | print("Remember that you need to add the following line to the " 170 | "urlpatterns:") 171 | print(leyend) 172 | -------------------------------------------------------------------------------- /djangocrudgenerator/management/commands/tests.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from django.test import TestCase 3 | from django import template 4 | from django.utils.safestring import SafeText 5 | from djangocrudgenerator.templatetags import generatortags 6 | from djangocrudgenerator.management.commands.crudgen import ModelCRUDGenerator 7 | from djangocrudgenerator.models import DjangoCRUDGeneratorTestModel 8 | 9 | import os 10 | import tempfile 11 | import inspect 12 | import itertools 13 | import string 14 | import djangocrudgenerator 15 | 16 | 17 | __all__ = ('ModelCRUDGeneratorTestCase',) 18 | 19 | 20 | class ModelCRUDGeneratorTestCase(TestCase): 21 | 22 | def __init__(self, *args, **kwargs): 23 | super(self.__class__, self).__init__(*args, **kwargs) 24 | self.settings= { 25 | "files": [ 26 | { 27 | "template": "only_for_testing_dont_override.txt", 28 | "name": tempfile.mktemp()+'${appname}${modelname_lower}', 29 | "override": True, 30 | }, 31 | { 32 | "template": "only_for_testing_dont_override.txt", 33 | "name": tempfile.mktemp()+'${appname}${modelname_lower}', 34 | "override": False, 35 | }, 36 | ] 37 | } 38 | self.appname = 'djangocrudgenerator' 39 | self.model_class = DjangoCRUDGeneratorTestModel 40 | self.modelname = self.model_class.__name__ 41 | self.modelname_lower = self.modelname.lower() 42 | self.application_path = os.path.dirname(djangocrudgenerator.__file__) 43 | self.template_name = 'only_for_testing_dont_override.txt' 44 | self.full_template_name = 'djangocrudgenerator/' + self.template_name 45 | self.tmpl_fullpath_alternative=os.path.join( 46 | self.application_path, 47 | "templates", 48 | self.template_name) 49 | self.rendered_template = u'%s.%s\n' % (self.appname, self.modelname) 50 | 51 | def __create_new_generator(self): 52 | args_spec = inspect.getargspec(ModelCRUDGenerator.__init__) 53 | self.assertEqual(len(args_spec.args), 4) 54 | self.assertEqual(args_spec.varargs, None) 55 | self.assertEqual(args_spec.keywords, None) 56 | return ModelCRUDGenerator(self.settings, self.appname, self.modelname) 57 | 58 | def test_create_new(self): 59 | generator = self.__create_new_generator() 60 | self.assertEqual(generator.__class__, ModelCRUDGenerator) 61 | self.assertEqual(generator.appname, self.appname) 62 | self.assertEqual(generator.modelname, self.modelname) 63 | self.assertEqual(generator.model, self.model_class) 64 | 65 | def test_get_model(self): 66 | get_model = ModelCRUDGenerator.get_model 67 | model_class = get_model(self.appname, self.modelname) 68 | self.assertEqual(model_class, self.model_class) 69 | 70 | def test_get_crungen_dir(self): 71 | get_crudgen_dir = ModelCRUDGenerator.get_crudgen_dir 72 | cg_dir = get_crudgen_dir() 73 | self.assertEqual(cg_dir, self.application_path) 74 | self.assertTrue(os.path.isdir(cg_dir)) 75 | 76 | def test_gen_template_name(self): 77 | gen_template_name = ModelCRUDGenerator.gen_template_name 78 | s = gen_template_name(self.template_name) 79 | self.assertEqual(s, 'djangocrudgenerator/' + self.template_name) 80 | 81 | def test_get_template(self): 82 | get_template = ModelCRUDGenerator.get_template 83 | tmpl = get_template( 84 | self.full_template_name, 85 | self.tmpl_fullpath_alternative) 86 | self.assertEqual(tmpl.__class__, template.Template) 87 | 88 | def test_render_template(self): 89 | render_template = ModelCRUDGenerator.render_template 90 | context = {'appname': self.appname, 'modelname': self.modelname} 91 | res = render_template(self.template_name, context) 92 | self.assertTrue(res.__class__ == SafeText) 93 | self.assertEqual(unicode(res), self.rendered_template) 94 | 95 | def test_generate_files(self): 96 | generator = self.__create_new_generator() 97 | results = generator.generate_files() 98 | self.assertEqual(len(results['backup']), 0) 99 | for f in self.settings['files']: 100 | fname = string.Template(f['name']).substitute(self.__dict__) 101 | self.assertTrue(fname in results['generated']) 102 | self.assertEqual(file(fname).read(), self.rendered_template) 103 | for fname in itertools.chain(results['generated'], results['backup']): 104 | os.remove(fname) 105 | -------------------------------------------------------------------------------- /djangocrudgenerator/models.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from django.db import models 4 | 5 | 6 | #test model 7 | class DjangoCRUDGeneratorTestModel(models.Model): 8 | name = models.CharField(max_length=255) 9 | -------------------------------------------------------------------------------- /djangocrudgenerator/templates/model_confirm_delete.html: -------------------------------------------------------------------------------- 1 | {% load generatortags %} 2 | {% start_comment %} coding: utf8 {% end_comment %} 3 | 4 |
5 | Are you sure to delete {% start_var %} object {% end_var %}? 6 |
7 | 8 |
9 | {% start_tag %} csrf_token {% end_tag %} 10 | {% start_var %} form {% end_var %} 11 |
12 | 13 | Cancel 14 |
15 |
16 | -------------------------------------------------------------------------------- /djangocrudgenerator/templates/model_form.html: -------------------------------------------------------------------------------- 1 | {% load generatortags %} 2 | 3 | {% verbatim %} 4 | 5 | {# coding: utf8 #} 6 | {% if object %} 7 | {% endverbatim %} 8 |
9 | 10 | {% verbatim %} 11 | 12 | Editing {{object}} 13 |
14 | {% else %} 15 | Create new {{modelname}} 16 | {% endif %} 17 | 18 | {% endverbatim %} 19 | 20 |
21 | {% start_tag %} csrf_token {% end_tag %} 22 | 23 | 24 | {% start_var %} form.as_table {% end_var %} 25 | 26 | 30 | 31 | 32 |
27 | 28 | Cancel 29 |
33 |
34 | -------------------------------------------------------------------------------- /djangocrudgenerator/templates/model_list.html: -------------------------------------------------------------------------------- 1 | {% load generatortags %} 2 | 3 | {% verbatim %} 4 | {# coding: utf8 #} 5 | {% endverbatim %} 6 | 7 | 8 | {% start_tag %} if perms.{{appname|lower}}.add_{{modelname|lower}} {% end_tag %} 9 | New {{modelname}} 10 | {% verbatim %} {% endif %} {% endverbatim %} 11 | 12 | {% verbatim %} {% if object_list %} {% endverbatim %} 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | {% verbatim %} {% for obj in object_list %} {% endverbatim %} 22 | 23 | 24 | 34 | 35 | {% start_tag %} endfor {% end_tag %} 36 | 37 |
{{modelname}} Actions
{{"{"}}{{"{"}}obj{{"}"}}{{"}"}} 25 | 26 | {% start_tag %} if perms.{{appname|lower}}.update_{{modelname|lower}} {% end_tag %} 27 | edit 28 | {% start_tag %} endif {% end_tag %} 29 | 30 | {% start_tag %} if perms.{{appname|lower}}.delete_{{modelname|lower}} {% end_tag %} 31 | delete 32 | {% start_tag %} endif {% end_tag %} 33 |
38 | {% start_tag %} if is_paginated {% end_tag %} 39 |
40 | 41 | {% start_tag%} if page_obj.has_previous {% end_tag%} 42 | Previous 43 | {% start_tag %} endif {% end_tag%} 44 | {% verbatim %} 45 | 46 | Page {{page_obj.number }} of {{ page_obj.paginator.num_pages }}. 47 | 48 | {% endverbatim %} 49 | {% start_tag %} if page_obj.has_next {% end_tag %} 50 | Next 51 | {% start_tag %} endif {% end_tag %} 52 | 53 |
54 | {% start_tag %} endif {% end_tag %} 55 | {% start_tag %} else {% end_tag %} 56 |

No {{modelname|lower}}s found.

57 | {% start_tag %} endif {% end_tag %} 58 | 59 | -------------------------------------------------------------------------------- /djangocrudgenerator/templates/only_for_testing_dont_override.txt: -------------------------------------------------------------------------------- 1 | {# *** THIS FILE EXIST JUST FOR TESTING PURPOSES; PLEASE DONT OVERRIDE IT. *** #}{{appname}}.{{modelname}} 2 | -------------------------------------------------------------------------------- /djangocrudgenerator/templates/urls.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from django.conf.urls.defaults import * 4 | from views import * 5 | 6 | {{modelname|lower}}_patterns= patterns( 7 | '', 8 | url(r'^list/page(?P[0-9]+)/(\?.*)?$', 9 | {{modelname}}ListView.as_view(), 10 | name='list'), 11 | url(r'^update/(?P\d+)/$', 12 | {{modelname}}UpdateView.as_view(), 13 | name='update'), 14 | url(r'^create/$', 15 | {{modelname}}CreateView.as_view(), 16 | name='create'), 17 | url(r'^delete/(?P[0-9]+)/$', 18 | {{modelname}}DeleteView.as_view(), 19 | name='delete')) 20 | 21 | 22 | newpatterns = patterns( 23 | '', 24 | url(r'^{{modelname|lower}}/', include({{modelname|lower}}_patterns, 25 | namespace="{{modelname|lower}}"))) 26 | 27 | 28 | try: 29 | urlpatterns += newpatterns 30 | except NameError: 31 | urlpatterns = newpatterns 32 | -------------------------------------------------------------------------------- /djangocrudgenerator/templates/views.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | #crudgenerator auto-generated code. 4 | #crudgenetaror date: {% now "jS F Y H:i" %} 5 | 6 | 7 | from django.core.urlresolvers import reverse 8 | from django.views.generic import ListView, CreateView, UpdateView, DeleteView 9 | from models import {{modelname}} 10 | 11 | 12 | __all__ = ('{{modelname}}ListView', '{{modelname}}UpdateView', 13 | '{{modelname}}CreateView', '{{modelname}}DeleteView') 14 | 15 | 16 | class {{modelname}}ListView(ListView): 17 | model = {{modelname}} 18 | paginate_by = 20 19 | 20 | 21 | class {{modelname}}DeleteView(DeleteView): 22 | model = {{modelname}} 23 | 24 | def get_success_url(self): 25 | return reverse("{{appname|lower}}:{{modelname|lower}}:list", args=(1,)) 26 | 27 | 28 | class {{modelname}}CreateView(CreateView): 29 | model = {{modelname}} 30 | 31 | def get_success_url(self): 32 | return reverse("{{appname|lower}}:{{modelname|lower}}:list", args=(1,)) 33 | 34 | 35 | class {{modelname}}UpdateView(UpdateView): 36 | model = {{modelname}} 37 | 38 | def get_success_url(self): 39 | return reverse("{{appname|lower}}:{{modelname|lower}}:list", args=(1,)) 40 | -------------------------------------------------------------------------------- /djangocrudgenerator/templatetags/.generatortags.py.swn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaanauati/django-crud-generator/c2f7ebd08267a1a950532f2a2368eb2f55177a8f/djangocrudgenerator/templatetags/.generatortags.py.swn -------------------------------------------------------------------------------- /djangocrudgenerator/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaanauati/django-crud-generator/c2f7ebd08267a1a950532f2a2368eb2f55177a8f/djangocrudgenerator/templatetags/__init__.py -------------------------------------------------------------------------------- /djangocrudgenerator/templatetags/generatortags.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from django import template 4 | 5 | register = template.Library() 6 | 7 | 8 | @register.simple_tag 9 | def gen_url_tag(*args, **kwargs): 10 | """ Helper Template tag that generates an url tag: 11 | {% url "the:url:path" %} 12 | """ 13 | if len(args) == 0: 14 | raise template.TemplateSyntaxError( 15 | "gen_url_tag require one o more arguments.") 16 | _kwargs = reduce(lambda i, k: i+u'%s="%s" ' % (k, kwargs[k]), kwargs, u'') 17 | return u'{%% url "%s" %s %%}' % (u":".join(args), _kwargs[:-1]) 18 | 19 | 20 | #TODO: use Django-1.5 {% template 'ananan' %} instead of the followin functios. 21 | #https://docs.djangoproject.com/en/dev/ref/templates/builtins/#templatetag 22 | @register.simple_tag 23 | def start_tag(): 24 | return u"{%" 25 | 26 | 27 | @register.simple_tag 28 | def end_tag(): 29 | return u"%}" 30 | 31 | 32 | @register.simple_tag 33 | def start_var(): 34 | return u"{{" 35 | 36 | 37 | @register.simple_tag 38 | def end_var(): 39 | return u"}}" 40 | 41 | 42 | @register.simple_tag 43 | def start_comment(): 44 | return u"{#" 45 | 46 | 47 | @register.simple_tag 48 | def end_comment(): 49 | return u"#}" 50 | -------------------------------------------------------------------------------- /djangocrudgenerator/templatetags/tests.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from django.test import TestCase 4 | from django import template 5 | from djangocrudgenerator.templatetags import generatortags 6 | 7 | __all__ = ('GeneratorTagsTestCase',) 8 | 9 | 10 | class GeneratorTagsTestCase(TestCase): 11 | 12 | def test_gen_url_tag(self): 13 | self.assertEqual( 14 | generatortags.gen_url_tag("first", "second", "last", arg=1), 15 | '{% url "first:second:last" arg="1" %}') 16 | with self.assertRaises(template.TemplateSyntaxError): 17 | generatortags.gen_url_tag(arg=1) 18 | 19 | def __simple_func_test(self, fcn, ret): 20 | self.assertEqual(fcn(), ret) 21 | with self.assertRaises(TypeError): 22 | fcn(1) 23 | 24 | def test_start_tag(self): 25 | self.__simple_func_test(generatortags.start_tag, '{%') 26 | 27 | def test_end_tag(self): 28 | self.__simple_func_test(generatortags.end_tag, '%}') 29 | 30 | def test_start_var(self): 31 | self.__simple_func_test(generatortags.start_var, '{{') 32 | 33 | def test_start_var(self): 34 | self.__simple_func_test(generatortags.end_var, '}}') 35 | 36 | def test_start_comment(self): 37 | self.__simple_func_test(generatortags.start_comment, '{#') 38 | 39 | def test_end_comment(self): 40 | self.__simple_func_test(generatortags.end_comment, '#}') 41 | -------------------------------------------------------------------------------- /djangocrudgenerator/tests.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from django.test import TestCase 4 | from djangocrudgenerator.templatetags import generatortags 5 | 6 | from djangocrudgenerator.templatetags.tests import * 7 | from djangocrudgenerator.management.commands.tests import * 8 | -------------------------------------------------------------------------------- /examples/exampleproject_01/README: -------------------------------------------------------------------------------- 1 | DESCRIPTION: 2 | This example is a fast demostration of the djangocrudgen app. 3 | Before of the execution of djangocrudgen, the application 'yourwebapp' 4 | just has only one model named 'YourModel'. After the execution of the 5 | 'crudgen' generator, all CRUD interfaces will be created . 6 | 7 | USAGE: 8 | $ python manage.py syncdb 9 | $ python manage.py crudgen yourwebapp YourModel 10 | $ python manage.py runserver 11 | 12 | go to http://localhost:8000/yourwebapp/yourmodel/list/page1/ 13 | -------------------------------------------------------------------------------- /examples/exampleproject_01/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaanauati/django-crud-generator/c2f7ebd08267a1a950532f2a2368eb2f55177a8f/examples/exampleproject_01/__init__.py -------------------------------------------------------------------------------- /examples/exampleproject_01/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from django.core.management import execute_manager 3 | import imp 4 | try: 5 | imp.find_module('settings') # Assumed to be in the same directory. 6 | except ImportError: 7 | import sys 8 | sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n" % __file__) 9 | sys.exit(1) 10 | 11 | import settings 12 | 13 | if __name__ == "__main__": 14 | execute_manager(settings) 15 | -------------------------------------------------------------------------------- /examples/exampleproject_01/settings.py: -------------------------------------------------------------------------------- 1 | # Django settings for exampleproject project. 2 | 3 | DEBUG = True 4 | TEMPLATE_DEBUG = DEBUG 5 | 6 | ADMINS = ( 7 | # ('Your Name', 'your_email@example.com'), 8 | ) 9 | 10 | MANAGERS = ADMINS 11 | 12 | DATABASES = { 13 | 'default': { 14 | 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 15 | 'NAME': './testdb.dat', # Or path to database file if using sqlite3. 16 | 'USER': '', # Not used with sqlite3. 17 | 'PASSWORD': '', # Not used with sqlite3. 18 | 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 19 | 'PORT': '', # Set to empty string for default. Not used with sqlite3. 20 | } 21 | } 22 | 23 | # Local time zone for this installation. Choices can be found here: 24 | # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name 25 | # although not all choices may be available on all operating systems. 26 | # On Unix systems, a value of None will cause Django to use the same 27 | # timezone as the operating system. 28 | # If running in a Windows environment this must be set to the same as your 29 | # system time zone. 30 | TIME_ZONE = 'America/Chicago' 31 | 32 | # Language code for this installation. All choices can be found here: 33 | # http://www.i18nguy.com/unicode/language-identifiers.html 34 | LANGUAGE_CODE = 'en-us' 35 | 36 | SITE_ID = 1 37 | 38 | # If you set this to False, Django will make some optimizations so as not 39 | # to load the internationalization machinery. 40 | USE_I18N = True 41 | 42 | # If you set this to False, Django will not format dates, numbers and 43 | # calendars according to the current locale 44 | USE_L10N = True 45 | 46 | # Absolute filesystem path to the directory that will hold user-uploaded files. 47 | # Example: "/home/media/media.lawrence.com/media/" 48 | MEDIA_ROOT = '' 49 | 50 | # URL that handles the media served from MEDIA_ROOT. Make sure to use a 51 | # trailing slash. 52 | # Examples: "http://media.lawrence.com/media/", "http://example.com/media/" 53 | MEDIA_URL = '' 54 | 55 | # Absolute path to the directory static files should be collected to. 56 | # Don't put anything in this directory yourself; store your static files 57 | # in apps' "static/" subdirectories and in STATICFILES_DIRS. 58 | # Example: "/home/media/media.lawrence.com/static/" 59 | STATIC_ROOT = '' 60 | 61 | # URL prefix for static files. 62 | # Example: "http://media.lawrence.com/static/" 63 | STATIC_URL = '/static/' 64 | 65 | # URL prefix for admin static files -- CSS, JavaScript and images. 66 | # Make sure to use a trailing slash. 67 | # Examples: "http://foo.com/static/admin/", "/static/admin/". 68 | ADMIN_MEDIA_PREFIX = '/static/admin/' 69 | 70 | # Additional locations of static files 71 | STATICFILES_DIRS = ( 72 | # Put strings here, like "/home/html/static" or "C:/www/django/static". 73 | # Always use forward slashes, even on Windows. 74 | # Don't forget to use absolute paths, not relative paths. 75 | ) 76 | 77 | # List of finder classes that know how to find static files in 78 | # various locations. 79 | STATICFILES_FINDERS = ( 80 | 'django.contrib.staticfiles.finders.FileSystemFinder', 81 | 'django.contrib.staticfiles.finders.AppDirectoriesFinder', 82 | # 'django.contrib.staticfiles.finders.DefaultStorageFinder', 83 | ) 84 | 85 | # Make this unique, and don't share it with anybody. 86 | SECRET_KEY = '-ru6+#!pwnqignf$!uuim1ghsrt6oa-uk0zbofu$p*_^&w(e2$' 87 | 88 | # List of callables that know how to import templates from various sources. 89 | TEMPLATE_LOADERS = ( 90 | 'django.template.loaders.filesystem.Loader', 91 | 'django.template.loaders.app_directories.Loader', 92 | # 'django.template.loaders.eggs.Loader', 93 | ) 94 | 95 | MIDDLEWARE_CLASSES = ( 96 | 'django.middleware.common.CommonMiddleware', 97 | 'django.contrib.sessions.middleware.SessionMiddleware', 98 | 'django.middleware.csrf.CsrfViewMiddleware', 99 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 100 | 'django.contrib.messages.middleware.MessageMiddleware', 101 | ) 102 | 103 | ROOT_URLCONF = 'exampleproject_01.urls' 104 | 105 | TEMPLATE_DIRS = ( 106 | # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". 107 | # Always use forward slashes, even on Windows. 108 | # Don't forget to use absolute paths, not relative paths. 109 | './yourwebapp/templates/', 110 | ) 111 | 112 | INSTALLED_APPS = ( 113 | 'django.contrib.auth', 114 | 'django.contrib.contenttypes', 115 | 'django.contrib.sessions', 116 | 'django.contrib.sites', 117 | 'django.contrib.messages', 118 | 'django.contrib.staticfiles', 119 | # Uncomment the next line to enable the admin: 120 | # 'django.contrib.admin', 121 | # Uncomment the next line to enable admin documentation: 122 | # 'django.contrib.admindocs', 123 | 'djangocrudgenerator', 124 | 'yourwebapp', 125 | ) 126 | 127 | # A sample logging configuration. The only tangible logging 128 | # performed by this configuration is to send an email to 129 | # the site admins on every HTTP 500 error. 130 | # See http://docs.djangoproject.com/en/dev/topics/logging for 131 | # more details on how to customize your logging configuration. 132 | LOGGING = { 133 | 'version': 1, 134 | 'disable_existing_loggers': False, 135 | 'handlers': { 136 | 'mail_admins': { 137 | 'level': 'ERROR', 138 | 'class': 'django.utils.log.AdminEmailHandler' 139 | } 140 | }, 141 | 'loggers': { 142 | 'django.request': { 143 | 'handlers': ['mail_admins'], 144 | 'level': 'ERROR', 145 | 'propagate': True, 146 | }, 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /examples/exampleproject_01/testdb.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaanauati/django-crud-generator/c2f7ebd08267a1a950532f2a2368eb2f55177a8f/examples/exampleproject_01/testdb.dat -------------------------------------------------------------------------------- /examples/exampleproject_01/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls.defaults import patterns, include, url 2 | 3 | # Uncomment the next two lines to enable the admin: 4 | # from django.contrib import admin 5 | # admin.autodiscover() 6 | 7 | urlpatterns = patterns('', 8 | # Examples: 9 | # url(r'^$', 'exampleproject.views.home', name='home'), 10 | # url(r'^exampleproject/', include('exampleproject.foo.urls')), 11 | 12 | # Uncomment the admin/doc line below to enable admin documentation: 13 | # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 14 | 15 | # Uncomment the next line to enable the admin: 16 | # url(r'^admin/', include(admin.site.urls)), 17 | url(r'^yourwebapp/', include('yourwebapp.urls',namespace="yourwebapp")), 18 | 19 | ) 20 | -------------------------------------------------------------------------------- /examples/exampleproject_01/yourwebapp/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaanauati/django-crud-generator/c2f7ebd08267a1a950532f2a2368eb2f55177a8f/examples/exampleproject_01/yourwebapp/__init__.py -------------------------------------------------------------------------------- /examples/exampleproject_01/yourwebapp/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | class YourModel(models.Model): 4 | name=models.CharField(max_length=30) 5 | serial=models.CharField(max_length=20) 6 | def __str__(self): 7 | return self.name 8 | 9 | -------------------------------------------------------------------------------- /examples/exampleproject_01/yourwebapp/tests.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file demonstrates writing tests using the unittest module. These will pass 3 | when you run "manage.py test". 4 | 5 | Replace this with more appropriate tests for your application. 6 | """ 7 | 8 | from django.test import TestCase 9 | 10 | 11 | class SimpleTest(TestCase): 12 | def test_basic_addition(self): 13 | """ 14 | Tests that 1 + 1 always equals 2. 15 | """ 16 | self.assertEqual(1 + 1, 2) 17 | -------------------------------------------------------------------------------- /examples/exampleproject_01/yourwebapp/views.py: -------------------------------------------------------------------------------- 1 | # Create your views here. 2 | -------------------------------------------------------------------------------- /examples/exampleproject_02/README: -------------------------------------------------------------------------------- 1 | DESCRIPTION: 2 | This example shows the usage of custom templates for the CRUD generation. 3 | All templates are stored into the templates directory of the project (see 4 | 'templates' of the project). 5 | 6 | USAGE: 7 | $ python manage.py syncdb 8 | $ python manage.py crudgen yourwebapp YourModel 9 | $ python manage.py runserver 10 | 11 | goto http://localhost:8000/yourwebapp/yourmodel/list/page1/ 12 | 13 | -------------------------------------------------------------------------------- /examples/exampleproject_02/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaanauati/django-crud-generator/c2f7ebd08267a1a950532f2a2368eb2f55177a8f/examples/exampleproject_02/__init__.py -------------------------------------------------------------------------------- /examples/exampleproject_02/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from django.core.management import execute_manager 3 | import imp 4 | try: 5 | imp.find_module('settings') # Assumed to be in the same directory. 6 | except ImportError: 7 | import sys 8 | sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n" % __file__) 9 | sys.exit(1) 10 | 11 | import settings 12 | 13 | if __name__ == "__main__": 14 | execute_manager(settings) 15 | -------------------------------------------------------------------------------- /examples/exampleproject_02/settings.py: -------------------------------------------------------------------------------- 1 | # Django settings for exampleproject project. 2 | 3 | DEBUG = True 4 | TEMPLATE_DEBUG = DEBUG 5 | 6 | ADMINS = ( 7 | # ('Your Name', 'your_email@example.com'), 8 | ) 9 | 10 | MANAGERS = ADMINS 11 | 12 | DATABASES = { 13 | 'default': { 14 | 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 15 | 'NAME': './testdb.dat', # Or path to database file if using sqlite3. 16 | 'USER': '', # Not used with sqlite3. 17 | 'PASSWORD': '', # Not used with sqlite3. 18 | 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 19 | 'PORT': '', # Set to empty string for default. Not used with sqlite3. 20 | } 21 | } 22 | 23 | # Local time zone for this installation. Choices can be found here: 24 | # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name 25 | # although not all choices may be available on all operating systems. 26 | # On Unix systems, a value of None will cause Django to use the same 27 | # timezone as the operating system. 28 | # If running in a Windows environment this must be set to the same as your 29 | # system time zone. 30 | TIME_ZONE = 'America/Chicago' 31 | 32 | # Language code for this installation. All choices can be found here: 33 | # http://www.i18nguy.com/unicode/language-identifiers.html 34 | LANGUAGE_CODE = 'en-us' 35 | 36 | SITE_ID = 1 37 | 38 | # If you set this to False, Django will make some optimizations so as not 39 | # to load the internationalization machinery. 40 | USE_I18N = True 41 | 42 | # If you set this to False, Django will not format dates, numbers and 43 | # calendars according to the current locale 44 | USE_L10N = True 45 | 46 | # Absolute filesystem path to the directory that will hold user-uploaded files. 47 | # Example: "/home/media/media.lawrence.com/media/" 48 | MEDIA_ROOT = '' 49 | 50 | # URL that handles the media served from MEDIA_ROOT. Make sure to use a 51 | # trailing slash. 52 | # Examples: "http://media.lawrence.com/media/", "http://example.com/media/" 53 | MEDIA_URL = '' 54 | 55 | # Absolute path to the directory static files should be collected to. 56 | # Don't put anything in this directory yourself; store your static files 57 | # in apps' "static/" subdirectories and in STATICFILES_DIRS. 58 | # Example: "/home/media/media.lawrence.com/static/" 59 | STATIC_ROOT = '' 60 | 61 | # URL prefix for static files. 62 | # Example: "http://media.lawrence.com/static/" 63 | STATIC_URL = '/static/' 64 | 65 | # URL prefix for admin static files -- CSS, JavaScript and images. 66 | # Make sure to use a trailing slash. 67 | # Examples: "http://foo.com/static/admin/", "/static/admin/". 68 | ADMIN_MEDIA_PREFIX = '/static/admin/' 69 | 70 | # Additional locations of static files 71 | STATICFILES_DIRS = ( 72 | # Put strings here, like "/home/html/static" or "C:/www/django/static". 73 | # Always use forward slashes, even on Windows. 74 | # Don't forget to use absolute paths, not relative paths. 75 | ) 76 | 77 | # List of finder classes that know how to find static files in 78 | # various locations. 79 | STATICFILES_FINDERS = ( 80 | 'django.contrib.staticfiles.finders.FileSystemFinder', 81 | 'django.contrib.staticfiles.finders.AppDirectoriesFinder', 82 | # 'django.contrib.staticfiles.finders.DefaultStorageFinder', 83 | ) 84 | 85 | # Make this unique, and don't share it with anybody. 86 | SECRET_KEY = '-ru6+#!pwnqignf$!uuim1ghsrt6oa-uk0zbofu$p*_^&w(e2$' 87 | 88 | # List of callables that know how to import templates from various sources. 89 | TEMPLATE_LOADERS = ( 90 | 'django.template.loaders.filesystem.Loader', 91 | 'django.template.loaders.app_directories.Loader', 92 | # 'django.template.loaders.eggs.Loader', 93 | ) 94 | 95 | MIDDLEWARE_CLASSES = ( 96 | 'django.middleware.common.CommonMiddleware', 97 | 'django.contrib.sessions.middleware.SessionMiddleware', 98 | 'django.middleware.csrf.CsrfViewMiddleware', 99 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 100 | 'django.contrib.messages.middleware.MessageMiddleware', 101 | ) 102 | 103 | ROOT_URLCONF = 'exampleproject_02.urls' 104 | 105 | TEMPLATE_DIRS = ( 106 | # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". 107 | # Always use forward slashes, even on Windows. 108 | # Don't forget to use absolute paths, not relative paths. 109 | './templates/', 110 | './yourwebapp/templates/', 111 | ) 112 | 113 | INSTALLED_APPS = ( 114 | 'django.contrib.auth', 115 | 'django.contrib.contenttypes', 116 | 'django.contrib.sessions', 117 | 'django.contrib.sites', 118 | 'django.contrib.messages', 119 | 'django.contrib.staticfiles', 120 | # Uncomment the next line to enable the admin: 121 | # 'django.contrib.admin', 122 | # Uncomment the next line to enable admin documentation: 123 | # 'django.contrib.admindocs', 124 | 'djangocrudgenerator', 125 | 'yourwebapp', 126 | ) 127 | 128 | # A sample logging configuration. The only tangible logging 129 | # performed by this configuration is to send an email to 130 | # the site admins on every HTTP 500 error. 131 | # See http://docs.djangoproject.com/en/dev/topics/logging for 132 | # more details on how to customize your logging configuration. 133 | LOGGING = { 134 | 'version': 1, 135 | 'disable_existing_loggers': False, 136 | 'handlers': { 137 | 'mail_admins': { 138 | 'level': 'ERROR', 139 | 'class': 'django.utils.log.AdminEmailHandler' 140 | } 141 | }, 142 | 'loggers': { 143 | 'django.request': { 144 | 'handlers': ['mail_admins'], 145 | 'level': 'ERROR', 146 | 'propagate': True, 147 | }, 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /examples/exampleproject_02/templates/djangocrudgenerator/model_confirm_delete.html: -------------------------------------------------------------------------------- 1 | {% load generatortags %} 2 | {% start_comment %} coding: utf8 {% end_comment %} 3 | 4 |
5 | Are you sure to delete {% start_var %} object {% end_var %} 6 |
7 |
8 | {% verbatim %} 9 | {% csrf_token %} 10 | {{form}} 11 | {% endverbatim %} 12 |
13 | 14 | Cancel 15 |
16 |
17 | -------------------------------------------------------------------------------- /examples/exampleproject_02/templates/djangocrudgenerator/model_form.html: -------------------------------------------------------------------------------- 1 | {% load generatortags %} 2 | {% start_comment %} coding: utf8 {% end_comment %} 3 | 4 |

hello

5 | {% start_tag %} if object {% end_tag %} 6 |
7 | Editing {% start_var %} object {% end_var %} 8 |
9 | {% start_tag %} else {% end_tag %} 10 | Create new {{modelname}} 11 | {% start_tag %} endif {% end_tag %} 12 |
13 | {% verbatim %} 14 | {% csrf_token %} 15 | {% endverbatim %} 16 | 17 | 18 | {% verbatim %} 19 | {{form.as_table}} 20 | {% endverbatim %} 21 | 22 | 26 | 27 | 28 |
23 | 24 | Cancel 25 |
29 |
30 | -------------------------------------------------------------------------------- /examples/exampleproject_02/templates/djangocrudgenerator/model_list.html: -------------------------------------------------------------------------------- 1 | {% load generatortags %} 2 | 3 | {% start_comment %} coding: utf8 {% end_comment %} 4 | 5 |

OVERWIRTED TEMPLATE

6 | New {{modelname}} 7 | {% start_tag %} if object_list {% end_tag %} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | {% verbatim %} 16 | {% for obj in object_list %} 17 | {% endverbatim %} 18 | 19 | 20 | 24 | 25 | {% verbatim %} 26 | {% endfor %} 27 | 28 |
{{modelname}} Actions
{% start_var %} obj {% end_var %} 21 | edit 22 | delete 23 |
29 | {% if is_paginated %} 30 | {% endverbatim %} 31 |
32 | 33 | {% start_tag %} if page_obj.has_previous {% end_tag %} 34 | Previous 35 | {% start_tag %} endif {% end_tag %} 36 | {% verbatim %} 37 | 38 | Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }} 39 | 40 | {% if page_obj.has_next %} 41 | {% endverbatim %} 42 | Next 43 | {% start_tag %} endif {% end_tag %} 44 | 45 |
46 | {% start_tag %} endif {% end_tag %} 47 | {% start_tag %} else {% end_tag %} 48 |

No {{modelname|lower}}s found.

49 | {% start_tag %} endif {% end_tag %} 50 | 51 | -------------------------------------------------------------------------------- /examples/exampleproject_02/templates/djangocrudgenerator/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls.defaults import * 2 | from views import {{modelname}}ListView, {{modelname}}UpdateView, {{modelname}}CreateView, {{modelname}}DeleteView 3 | 4 | # MODEL URLS 5 | {{modelname|lower}}_patterns= patterns('', 6 | url(r'^list/page(?P[0-9]+)/(\?.*)?$', 7 | {{modelname}}ListView.as_view(), 8 | name='list'), 9 | url(r'^update/(?P\d+)/$', 10 | {{modelname}}UpdateView.as_view(), 11 | name='update'), 12 | url(r'^create/$', 13 | {{modelname}}CreateView.as_view(), 14 | name='create'), 15 | url(r'^delete/(?P[0-9]+)/$', 16 | {{modelname}}DeleteView.as_view(), 17 | name='delete'), 18 | ) 19 | 20 | newpatterns = patterns('', 21 | url(r'^{{modelname|lower}}/', include({{modelname|lower}}_patterns, namespace="{{modelname|lower}}")), 22 | ) 23 | 24 | try: 25 | urlpatterns+=newpatterns 26 | except NameError: 27 | urlpatterns=newpatterns 28 | -------------------------------------------------------------------------------- /examples/exampleproject_02/templates/djangocrudgenerator/views.py: -------------------------------------------------------------------------------- 1 | #crudgenerator auto-generated code. 2 | #crudgenetaror date: {% now "jS F Y H:i" %} 3 | from django.core.urlresolvers import reverse 4 | from django.views.generic import ListView, CreateView, UpdateView, DeleteView 5 | from models import {{modelname}} 6 | 7 | #modified template 8 | 9 | class {{modelname}}ListView(ListView): 10 | model={{modelname}} 11 | paginate_by=20 12 | 13 | class {{modelname}}DeleteView(DeleteView): 14 | model={{modelname}} 15 | def get_success_url(self): 16 | return reverse("{{appname|lower}}:{{modelname|lower}}:list", args=(1,)) 17 | 18 | class {{modelname}}CreateView(CreateView): 19 | model={{modelname}} 20 | def get_success_url(self): 21 | return reverse("{{appname|lower}}:{{modelname|lower}}:list", args=(1,)) 22 | 23 | class {{modelname}}UpdateView(UpdateView): 24 | model={{modelname}} 25 | def get_success_url(self): 26 | return reverse("{{appname|lower}}:{{modelname|lower}}:list", args=(1,)) 27 | -------------------------------------------------------------------------------- /examples/exampleproject_02/testdb.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaanauati/django-crud-generator/c2f7ebd08267a1a950532f2a2368eb2f55177a8f/examples/exampleproject_02/testdb.dat -------------------------------------------------------------------------------- /examples/exampleproject_02/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls.defaults import patterns, include, url 2 | 3 | # Uncomment the next two lines to enable the admin: 4 | # from django.contrib import admin 5 | # admin.autodiscover() 6 | 7 | urlpatterns = patterns('', 8 | # Examples: 9 | # url(r'^$', 'exampleproject.views.home', name='home'), 10 | # url(r'^exampleproject/', include('exampleproject.foo.urls')), 11 | 12 | # Uncomment the admin/doc line below to enable admin documentation: 13 | # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 14 | 15 | # Uncomment the next line to enable the admin: 16 | # url(r'^admin/', include(admin.site.urls)), 17 | url(r'^yourwebapp/', include('yourwebapp.urls',namespace="yourwebapp")), 18 | 19 | ) 20 | -------------------------------------------------------------------------------- /examples/exampleproject_02/yourwebapp/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaanauati/django-crud-generator/c2f7ebd08267a1a950532f2a2368eb2f55177a8f/examples/exampleproject_02/yourwebapp/__init__.py -------------------------------------------------------------------------------- /examples/exampleproject_02/yourwebapp/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | class YourModel(models.Model): 4 | name=models.CharField(max_length=30) 5 | serial=models.CharField(max_length=20) 6 | def __str__(self): 7 | return self.name 8 | 9 | -------------------------------------------------------------------------------- /examples/exampleproject_02/yourwebapp/tests.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file demonstrates writing tests using the unittest module. These will pass 3 | when you run "manage.py test". 4 | 5 | Replace this with more appropriate tests for your application. 6 | """ 7 | 8 | from django.test import TestCase 9 | 10 | 11 | class SimpleTest(TestCase): 12 | def test_basic_addition(self): 13 | """ 14 | Tests that 1 + 1 always equals 2. 15 | """ 16 | self.assertEqual(1 + 1, 2) 17 | -------------------------------------------------------------------------------- /examples/exampleproject_02/yourwebapp/views.py: -------------------------------------------------------------------------------- 1 | # Create your views here. 2 | #crudgenerator auto-generated code. 3 | #crudgenetaror date: 14th January 2012 13:52 4 | 5 | #modified template 6 | 7 | from django.core.urlresolvers import reverse 8 | from django.views.generic import ListView, CreateView, UpdateView, DeleteView 9 | from models import YourModel 10 | 11 | 12 | class YourModelListView(ListView): 13 | model=YourModel 14 | 15 | class YourModelDeleteView(DeleteView): 16 | model=YourModel 17 | def get_success_url(self): 18 | return reverse("yourwebapp:yourmodel:list", args=(1,)) 19 | 20 | class YourModelCreateView(CreateView): 21 | model=YourModel 22 | def get_success_url(self): 23 | return reverse("yourwebapp:yourmodel:list", args=(1,)) 24 | 25 | class YourModelUpdateView(UpdateView): 26 | model=YourModel 27 | def get_success_url(self): 28 | return reverse("yourwebapp:yourmodel:list", args=(1,)) 29 | from django.conf.urls.defaults import * 30 | from views import YourModelListView, YourModelUpdateView, YourModelCreateView, YourModelDeleteView 31 | 32 | # MODEL URLS 33 | yourmodel_patterns= patterns('', 34 | url(r'^list/page(?P[0-9]+)/(\?.*)?$', 35 | YourModelListView.as_view(), 36 | name='list'), 37 | url(r'^update/(?P\d+)/$', 38 | YourModelUpdateView.as_view(), 39 | name='update'), 40 | url(r'^create/$', 41 | YourModelCreateView.as_view(), 42 | name='create'), 43 | url(r'^delete/(?P[0-9]+)/$', 44 | YourModelDeleteView.as_view(), 45 | name='delete'), 46 | ) 47 | 48 | newpatterns = patterns('', 49 | url(r'^yourmodel/', include(yourmodel_patterns, namespace="yourmodel")), 50 | ) 51 | 52 | try: 53 | urlpatterns+=newpatterns 54 | except NameError: 55 | urlpatterns=newpatterns 56 | #crudgenerator auto-generated code. 57 | #crudgenetaror date: 14th January 2012 13:53 58 | 59 | #modified template 60 | 61 | from django.core.urlresolvers import reverse 62 | from django.views.generic import ListView, CreateView, UpdateView, DeleteView 63 | from models import YourModel 64 | 65 | 66 | class YourModelListView(ListView): 67 | model=YourModel 68 | 69 | class YourModelDeleteView(DeleteView): 70 | model=YourModel 71 | def get_success_url(self): 72 | return reverse("yourwebapp:yourmodel:list", args=(1,)) 73 | 74 | class YourModelCreateView(CreateView): 75 | model=YourModel 76 | def get_success_url(self): 77 | return reverse("yourwebapp:yourmodel:list", args=(1,)) 78 | 79 | class YourModelUpdateView(UpdateView): 80 | model=YourModel 81 | def get_success_url(self): 82 | return reverse("yourwebapp:yourmodel:list", args=(1,)) 83 | -------------------------------------------------------------------------------- /examples/exampleproject_03/README: -------------------------------------------------------------------------------- 1 | DESCRIPTION: 2 | This example shows an more advanced usage of djangocrudgenerator: 3 | Shows how to overwrite the configuration of the generator by defining of 4 | the DJANGOCRUDGENERATOR_SETTINGS variable into the project settings file 5 | (settings.py) to add an extra file to the generation (forms.py). 6 | For more see the following files: 7 | - At the bottom of the settings.py 8 | - templates/djangocrudgenerator/form.py 9 | 10 | USAGE: 11 | $ python manage.py syncdb 12 | $ python manage.py crudgen yourwebapp YourModel 13 | $ python manage.py runserver 14 | 15 | goto http://localhost:8000/yourwebapp/yourmodel/list/page1/ 16 | 17 | -------------------------------------------------------------------------------- /examples/exampleproject_03/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaanauati/django-crud-generator/c2f7ebd08267a1a950532f2a2368eb2f55177a8f/examples/exampleproject_03/__init__.py -------------------------------------------------------------------------------- /examples/exampleproject_03/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from django.core.management import execute_manager 3 | import imp 4 | try: 5 | imp.find_module('settings') # Assumed to be in the same directory. 6 | except ImportError: 7 | import sys 8 | sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n" % __file__) 9 | sys.exit(1) 10 | 11 | import settings 12 | 13 | if __name__ == "__main__": 14 | execute_manager(settings) 15 | -------------------------------------------------------------------------------- /examples/exampleproject_03/settings.py: -------------------------------------------------------------------------------- 1 | # Django settings for exampleproject project. 2 | 3 | DEBUG = True 4 | TEMPLATE_DEBUG = DEBUG 5 | 6 | ADMINS = ( 7 | # ('Your Name', 'your_email@example.com'), 8 | ) 9 | 10 | MANAGERS = ADMINS 11 | 12 | DATABASES = { 13 | 'default': { 14 | 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 15 | 'NAME': './testdb.dat', # Or path to database file if using sqlite3. 16 | 'USER': '', # Not used with sqlite3. 17 | 'PASSWORD': '', # Not used with sqlite3. 18 | 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 19 | 'PORT': '', # Set to empty string for default. Not used with sqlite3. 20 | } 21 | } 22 | 23 | # Local time zone for this installation. Choices can be found here: 24 | # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name 25 | # although not all choices may be available on all operating systems. 26 | # On Unix systems, a value of None will cause Django to use the same 27 | # timezone as the operating system. 28 | # If running in a Windows environment this must be set to the same as your 29 | # system time zone. 30 | TIME_ZONE = 'America/Chicago' 31 | 32 | # Language code for this installation. All choices can be found here: 33 | # http://www.i18nguy.com/unicode/language-identifiers.html 34 | LANGUAGE_CODE = 'en-us' 35 | 36 | SITE_ID = 1 37 | 38 | # If you set this to False, Django will make some optimizations so as not 39 | # to load the internationalization machinery. 40 | USE_I18N = True 41 | 42 | # If you set this to False, Django will not format dates, numbers and 43 | # calendars according to the current locale 44 | USE_L10N = True 45 | 46 | # Absolute filesystem path to the directory that will hold user-uploaded files. 47 | # Example: "/home/media/media.lawrence.com/media/" 48 | MEDIA_ROOT = '' 49 | 50 | # URL that handles the media served from MEDIA_ROOT. Make sure to use a 51 | # trailing slash. 52 | # Examples: "http://media.lawrence.com/media/", "http://example.com/media/" 53 | MEDIA_URL = '' 54 | 55 | # Absolute path to the directory static files should be collected to. 56 | # Don't put anything in this directory yourself; store your static files 57 | # in apps' "static/" subdirectories and in STATICFILES_DIRS. 58 | # Example: "/home/media/media.lawrence.com/static/" 59 | STATIC_ROOT = '' 60 | 61 | # URL prefix for static files. 62 | # Example: "http://media.lawrence.com/static/" 63 | STATIC_URL = '/static/' 64 | 65 | # URL prefix for admin static files -- CSS, JavaScript and images. 66 | # Make sure to use a trailing slash. 67 | # Examples: "http://foo.com/static/admin/", "/static/admin/". 68 | ADMIN_MEDIA_PREFIX = '/static/admin/' 69 | 70 | # Additional locations of static files 71 | STATICFILES_DIRS = ( 72 | # Put strings here, like "/home/html/static" or "C:/www/django/static". 73 | # Always use forward slashes, even on Windows. 74 | # Don't forget to use absolute paths, not relative paths. 75 | ) 76 | 77 | # List of finder classes that know how to find static files in 78 | # various locations. 79 | STATICFILES_FINDERS = ( 80 | 'django.contrib.staticfiles.finders.FileSystemFinder', 81 | 'django.contrib.staticfiles.finders.AppDirectoriesFinder', 82 | # 'django.contrib.staticfiles.finders.DefaultStorageFinder', 83 | ) 84 | 85 | # Make this unique, and don't share it with anybody. 86 | SECRET_KEY = '-ru6+#!pwnqignf$!uuim1ghsrt6oa-uk0zbofu$p*_^&w(e2$' 87 | 88 | # List of callables that know how to import templates from various sources. 89 | TEMPLATE_LOADERS = ( 90 | 'django.template.loaders.filesystem.Loader', 91 | 'django.template.loaders.app_directories.Loader', 92 | # 'django.template.loaders.eggs.Loader', 93 | ) 94 | 95 | MIDDLEWARE_CLASSES = ( 96 | 'django.middleware.common.CommonMiddleware', 97 | 'django.contrib.sessions.middleware.SessionMiddleware', 98 | 'django.middleware.csrf.CsrfViewMiddleware', 99 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 100 | 'django.contrib.messages.middleware.MessageMiddleware', 101 | ) 102 | 103 | ROOT_URLCONF = 'exampleproject_03.urls' 104 | 105 | TEMPLATE_DIRS = ( 106 | # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". 107 | # Always use forward slashes, even on Windows. 108 | # Don't forget to use absolute paths, not relative paths. 109 | './yourwebapp/templates/', 110 | './templates/', 111 | ) 112 | 113 | INSTALLED_APPS = ( 114 | 'django.contrib.auth', 115 | 'django.contrib.contenttypes', 116 | 'django.contrib.sessions', 117 | 'django.contrib.sites', 118 | 'django.contrib.messages', 119 | 'django.contrib.staticfiles', 120 | # Uncomment the next line to enable the admin: 121 | # 'django.contrib.admin', 122 | # Uncomment the next line to enable admin documentation: 123 | # 'django.contrib.admindocs', 124 | 'djangocrudgenerator', 125 | 'yourwebapp', 126 | ) 127 | 128 | # A sample logging configuration. The only tangible logging 129 | # performed by this configuration is to send an email to 130 | # the site admins on every HTTP 500 error. 131 | # See http://docs.djangoproject.com/en/dev/topics/logging for 132 | # more details on how to customize your logging configuration. 133 | LOGGING = { 134 | 'version': 1, 135 | 'disable_existing_loggers': False, 136 | 'handlers': { 137 | 'mail_admins': { 138 | 'level': 'ERROR', 139 | 'class': 'django.utils.log.AdminEmailHandler' 140 | } 141 | }, 142 | 'loggers': { 143 | 'django.request': { 144 | 'handlers': ['mail_admins'], 145 | 'level': 'ERROR', 146 | 'propagate': True, 147 | }, 148 | } 149 | } 150 | 151 | 152 | 153 | """ 154 | Overrides the configuration file of the generator. 155 | """ 156 | DJANGOCRUDGENERATOR_SETTINGS = { 157 | "files" : [\ 158 | { "template":"model_form.html", 159 | "name": "${appname}/templates/${appname}/${modelname_lower}_form.html", 160 | "override":True, 161 | }, 162 | { "template":"model_confirm_delete.html", 163 | "name": "${appname}/templates/${appname}/${modelname_lower}_confirm_delete.html", 164 | "override":True, 165 | }, 166 | { "template":"model_list.html", 167 | "name": "${appname}/templates/${appname}/${modelname_lower}_list.html", 168 | "override":True, 169 | }, 170 | { "template":"views.py", 171 | "name": "${appname}/views.py", 172 | "override":False, 173 | }, 174 | { "template":"urls.py", 175 | "name": "${appname}/urls.py", 176 | "override":False, 177 | }, 178 | { "template":"forms.py", 179 | "name": "${appname}/forms.py", 180 | "override":False, 181 | }, 182 | ] 183 | } 184 | -------------------------------------------------------------------------------- /examples/exampleproject_03/templates/djangocrudgenerator/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from {{appname}}.models import {{modelname}} 3 | 4 | class {{modelname}}ModelForm(forms.ModelForm): 5 | class Meta: 6 | model = {{modelname}} 7 | extrafield = forms.CharField(label="Extra field for {{modelname}}") 8 | 9 | -------------------------------------------------------------------------------- /examples/exampleproject_03/templates/djangocrudgenerator/model_confirm_delete.html: -------------------------------------------------------------------------------- 1 | {% load generatortags %} 2 | {% start_comment %} coding: utf8 {% end_comment %} 3 | 4 |
5 | Are you sure to delete {% start_var %} object {% end_var %}? 6 |
7 |
8 | {% verbatim %} 9 | {% csrf_token %} 10 | {{ form }} 11 | {% endverbatim %} 12 |
13 | 14 | Cancel 15 |
16 |
17 | -------------------------------------------------------------------------------- /examples/exampleproject_03/templates/djangocrudgenerator/model_form.html: -------------------------------------------------------------------------------- 1 | {% load generatortags %} 2 | {% start_comment %} coding: utf8 {% end_comment %} 3 | {% start_tag %} if object {% end_tag %} 4 |
5 | Editing {{object}} 6 |
7 | {% start_tag %} else {% end_tag %} 8 | Create new {{modelname}} 9 | {% start_tag %} endif {% end_tag %} 10 |
11 | {% start_tag %} csrf_token {% end_tag %} 12 | 13 | 14 | {% start_var %} form.as_table {% end_var %} 15 | 16 | 20 | 21 | 22 |
17 | 18 | Cancel 19 |
23 |
24 | -------------------------------------------------------------------------------- /examples/exampleproject_03/templates/djangocrudgenerator/model_list.html: -------------------------------------------------------------------------------- 1 | {% load generatortags %} 2 | {% start_comment %} coding: utf8 {% end_comment %} 3 | 4 |

OVERWIRTED TEMPLATE

5 | New {{modelname}} 6 | {% start_tag %} if object_list {% end_tag %} 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | {% start_tag %} for obj in object_list {% end_tag %} 15 | 16 | 17 | 21 | 22 | {% start_tag %} endfor {% end_tag %} 23 | 24 |
{{modelname}} Actions
{% start_var %} obj {% end_var %} 18 | edit 19 | delete 20 |
25 | {% start_tag %} if is_paginated {% end_tag %} 26 |
27 | 28 | {% start_tag %} if page_obj.has_previous {% end_tag %} 29 | Previous 30 | {% start_tag %} endif {% end_tag %} 31 | {% verbatim %} 32 | 33 | Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}. 34 | 35 | {% endverbatim %} 36 | {% start_tag %}if page_obj.has_next {% end_tag %} 37 | Next 38 | {% start_tag %} endif {% end_tag %} 39 | 40 |
41 | {% start_tag %} endif {% end_tag %} 42 | {% start_tag %} else {% end_tag %} 43 |

No {{modelname|lower}}s found.

44 | {% start_tag %} endif {% end_tag %} 45 | 46 | -------------------------------------------------------------------------------- /examples/exampleproject_03/templates/djangocrudgenerator/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls.defaults import * 2 | from views import {{modelname}}ListView, {{modelname}}UpdateView, {{modelname}}CreateView, {{modelname}}DeleteView 3 | 4 | # MODEL URLS 5 | {{modelname|lower}}_patterns= patterns('', 6 | url(r'^list/page(?P[0-9]+)/(\?.*)?$', 7 | {{modelname}}ListView.as_view(), 8 | name='list'), 9 | url(r'^update/(?P\d+)/$', 10 | {{modelname}}UpdateView.as_view(), 11 | name='update'), 12 | url(r'^create/$', 13 | {{modelname}}CreateView.as_view(), 14 | name='create'), 15 | url(r'^delete/(?P[0-9]+)/$', 16 | {{modelname}}DeleteView.as_view(), 17 | name='delete'), 18 | ) 19 | 20 | newpatterns = patterns('', 21 | url(r'^{{modelname|lower}}/', include({{modelname|lower}}_patterns, namespace="{{modelname|lower}}")), 22 | ) 23 | 24 | try: 25 | urlpatterns+=newpatterns 26 | except NameError: 27 | urlpatterns=newpatterns 28 | -------------------------------------------------------------------------------- /examples/exampleproject_03/templates/djangocrudgenerator/views.py: -------------------------------------------------------------------------------- 1 | #crudgenerator auto-generated code. 2 | #crudgenetaror date: {% now "jS F Y H:i" %} 3 | from django.core.urlresolvers import reverse 4 | from django.views.generic import ListView, CreateView, UpdateView, DeleteView 5 | from models import {{modelname}} 6 | from {{appname}}.forms import {{modelname}}ModelForm 7 | 8 | 9 | class {{modelname}}ListView(ListView): 10 | model={{modelname}} 11 | paginate_by=20 12 | 13 | class {{modelname}}DeleteView(DeleteView): 14 | model={{modelname}} 15 | def get_success_url(self): 16 | return reverse("{{appname|lower}}:{{modelname|lower}}:list", args=(1,)) 17 | 18 | class {{modelname}}CreateView(CreateView): 19 | model={{modelname}} 20 | form_class={{modelname}}ModelForm 21 | def get_success_url(self): 22 | return reverse("{{appname|lower}}:{{modelname|lower}}:list", args=(1,)) 23 | 24 | class {{modelname}}UpdateView(UpdateView): 25 | model={{modelname}} 26 | def get_success_url(self): 27 | return reverse("{{appname|lower}}:{{modelname|lower}}:list", args=(1,)) 28 | -------------------------------------------------------------------------------- /examples/exampleproject_03/testdb.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaanauati/django-crud-generator/c2f7ebd08267a1a950532f2a2368eb2f55177a8f/examples/exampleproject_03/testdb.dat -------------------------------------------------------------------------------- /examples/exampleproject_03/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls.defaults import patterns, include, url 2 | 3 | # Uncomment the next two lines to enable the admin: 4 | # from django.contrib import admin 5 | # admin.autodiscover() 6 | 7 | urlpatterns = patterns('', 8 | # Examples: 9 | # url(r'^$', 'exampleproject.views.home', name='home'), 10 | # url(r'^exampleproject/', include('exampleproject.foo.urls')), 11 | 12 | # Uncomment the admin/doc line below to enable admin documentation: 13 | # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 14 | 15 | # Uncomment the next line to enable the admin: 16 | # url(r'^admin/', include(admin.site.urls)), 17 | url(r'^yourwebapp/', include('yourwebapp.urls',namespace='yourwebapp')), 18 | ) 19 | -------------------------------------------------------------------------------- /examples/exampleproject_03/yourwebapp/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jaanauati/django-crud-generator/c2f7ebd08267a1a950532f2a2368eb2f55177a8f/examples/exampleproject_03/yourwebapp/__init__.py -------------------------------------------------------------------------------- /examples/exampleproject_03/yourwebapp/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | class YourModel(models.Model): 4 | name=models.CharField(max_length=30) 5 | serial=models.CharField(max_length=20) 6 | def __str__(self): 7 | return self.name 8 | 9 | -------------------------------------------------------------------------------- /examples/exampleproject_03/yourwebapp/tests.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file demonstrates writing tests using the unittest module. These will pass 3 | when you run "manage.py test". 4 | 5 | Replace this with more appropriate tests for your application. 6 | """ 7 | 8 | from django.test import TestCase 9 | 10 | 11 | class SimpleTest(TestCase): 12 | def test_basic_addition(self): 13 | """ 14 | Tests that 1 + 1 always equals 2. 15 | """ 16 | self.assertEqual(1 + 1, 2) 17 | -------------------------------------------------------------------------------- /examples/exampleproject_03/yourwebapp/views.py: -------------------------------------------------------------------------------- 1 | # Create your views here. 2 | #crudgenerator auto-generated code. 3 | #crudgenetaror date: 15th January 2012 09:27 4 | from django.core.urlresolvers import reverse 5 | from django.views.generic import ListView, CreateView, UpdateView, DeleteView 6 | from models import YourModel 7 | from yourwebapp.forms import YourModelModelForm 8 | 9 | 10 | class YourModelListView(ListView): 11 | model=YourModel 12 | paginate_by=20 13 | 14 | class YourModelDeleteView(DeleteView): 15 | model=YourModel 16 | def get_success_url(self): 17 | return reverse("yourwebapp:yourmodel:list", args=(1,)) 18 | 19 | class YourModelCreateView(CreateView): 20 | model=YourModel 21 | form_class=YourModelModelForm 22 | def get_success_url(self): 23 | return reverse("yourwebapp:yourmodel:list", args=(1,)) 24 | 25 | class YourModelUpdateView(UpdateView): 26 | model=YourModel 27 | def get_success_url(self): 28 | return reverse("yourwebapp:yourmodel:list", args=(1,)) 29 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | 3 | from setuptools import setup 4 | import os 5 | 6 | read = lambda fname: open(os.path.join(os.path.dirname(__file__), fname)).read() 7 | 8 | setup( 9 | name = "django-crudgenerator", 10 | version = "0.0.9", 11 | author = "Jonatan Alexis Anauati", 12 | author_email = "barakawins@gmail.com", 13 | description = ("A simple CRUD generator for django.",), 14 | license = "BSD", 15 | keywords = "web django crud generator automatic", 16 | packages=[\ 17 | 'djangocrudgenerator', 18 | 'djangocrudgenerator/management', 19 | 'djangocrudgenerator/management/commands', 20 | 'djangocrudgenerator/templates', 21 | 'djangocrudgenerator/templatetags', 22 | 'djangocrudgenerator/config' 23 | ], 24 | package_data= { 25 | '':['*.html', '*.txt'], 26 | }, 27 | long_description=read('README',), 28 | classifiers=[ 29 | "Development Status :: 3 - Alpha", 30 | "Topic :: Utilities", 31 | "License :: OSI Approved :: BSD License", 32 | ], 33 | ) 34 | --------------------------------------------------------------------------------