1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132 | from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse
class AutomagicModel(models.Model):
class Meta:
abstract=True
def get_absolute_url(self):
return reverse(self.get_absolute_url_alias(),kwargs={'object_id':self.id})
def get_create_url(self):
return reverse(self.get_create_url_alias())
def get_index_url(self):
return "/%s/%s/" % (self._meta.app_label,self._meta.module_name)
def get_delete_url(self):
return reverse(self.get_delete_url_alias(),kwargs={'object_id':self.id})
def get_update_url(self):
return reverse(self.get_update_url_alias(),kwargs={'object_id':self.id})
def get_absolute_url_regexp(self):
return "^%s/(?P<object_id>\d+)/$" % (self._meta.module_name)
def get_create_url_regexp(self):
return '^new/%s/$' % (self._meta.module_name)
def get_index_url_regexp(self):
return "^%s/page/(?P<page>[0-9|last]+)?$" % (self._meta.module_name)
def get_delete_url_regexp(self):
return "^%s/(?P<object_id>\d+)/delete$" % (self._meta.module_name)
def get_update_url_regexp(self):
return "^%s/(?P<object_id>\d+)/update$" % (self._meta.module_name)
def get_absolute_url_alias(self):
return "%s_%s_absolute" % (self._meta.app_label,self._meta.module_name)
def get_create_url_alias(self):
return '%s_%s_create' % (self._meta.app_label,self._meta.module_name)
def get_index_url_alias(self):
return "%s_%s_index" % (self._meta.app_label,self._meta.module_name)
def get_delete_url_alias(self):
return "%s_%s_delete" % (self._meta.app_label,self._meta.module_name)
def get_update_url_alias(self):
return "%s_%s_update" % (self._meta.app_label,self._meta.module_name)
def build_generic_CRUD_urls(self, model_class):
from django.conf.urls.defaults import url, patterns
return patterns('django.views.generic',
url(self.get_index_url_regexp(), 'list_detail.object_list', {'queryset': model_class.objects.all(),'paginate_by':2,'extra_context':{'dummy_object':self}},self.get_index_url_alias()),
url(self.get_absolute_url_regexp(), 'list_detail.object_detail', {'queryset': model_class.objects.all()},self.get_absolute_url_alias()),
url(self.get_create_url_regexp(), 'create_update.create_object', {'model':model_class},self.get_create_url_alias()),
url(self.get_update_url_regexp(), 'create_update.update_object', {'model':model_class},self.get_update_url_alias()),
url(self.get_delete_url_regexp(), 'create_update.delete_object', {'model':model_class,'post_delete_redirect':self.get_index_url()},self.get_delete_url_alias()),
)
class Animal(AutomagicModel):
content_type = models.ForeignKey(ContentType,editable=False,null=True)
name = models.CharField(max_length=255)
def __unicode__(self):
return '('+str(self.id)+') '+self.name
class Dog(Animal):
is_lucky = models.BooleanField()
class Cat(Animal):
lives_left = models.IntegerField()
class Bird(Animal):
velocity = models.IntegerField()
'''
In [1]: from animals.models import MyModel
In [2]: m=MyModel()
In [3]: m.id=3
In [4]: m.get_create_url()
Out[4]: '/animals/new/mymodel/'
In [5]: m.get_delete_url()
Out[5]: '/animals/mymodel/3/delete'
In [6]: m.get_index_url()
Out[6]: '/animals/mymodel/'
In [7]: m.get_update_url()
Out[7]: '/animals/mymodel/3/update'
and now with a child class
In [1]: from animals.models import Dog
In [2]: d=Dog()
In [3]: d.id=4
In [4]: d.get
d.get_absolute_url d.get_create_url d.get_delete_url d.get_index_url d.get_update_url
In [4]: d.get_update_url()
Out[4]: '/animals/dog/4/update'
Now, in your urls.py do this:
from django.conf.urls.defaults import *
from animals.models import Dog, Cat, Bird
urlpatterns = patterns('animals.views',
url(r'^$', 'index', {},Dog._meta.app_label),
)
dog=Dog()
cat=Cat()
bird=Bird()
urlpatterns+=dog.build_generic_CRUD_urls(Dog)
urlpatterns+=cat.build_generic_CRUD_urls(Cat)
urlpatterns+=bird.build_generic_CRUD_urls(Bird)
this are the generated urls
^animals/ ^dog/(page/)?(?P<page>[0-9]+)?$
^animals/ ^dog/(?P<object_id>\d+)/$
^animals/ ^new/dog/$
^animals/ ^dog/(?P<object_id>\d+)/update$
^animals/ ^dog/(?P<object_id>\d+)/delete$
^animals/ ^cat/(page/)?(?P<page>[0-9]+)?$
^animals/ ^cat/(?P<object_id>\d+)/$
^animals/ ^new/cat/$
^animals/ ^cat/(?P<object_id>\d+)/update$
^animals/ ^cat/(?P<object_id>\d+)/delete$
^animals/ ^bird/(page/)?(?P<page>[0-9]+)?$
^animals/ ^bird/(?P<object_id>\d+)/$
^animals/ ^new/bird/$
^animals/ ^bird/(?P<object_id>\d+)/update$
^animals/ ^bird/(?P<object_id>\d+)/delete$
'''
|
Comments