Skip to content

Instantly share code, notes, and snippets.

@carlcarl
Last active January 1, 2016 20:59
Show Gist options
  • Save carlcarl/8200555 to your computer and use it in GitHub Desktop.
Save carlcarl/8200555 to your computer and use it in GitHub Desktop.
Django CRUD snippet
# From https://djangosnippets.org/snippets/2309/#!
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 view
def build_generic_CRUD_urls(self, model_class):
return patterns(
'django.views.generic',
url(
self.get_index_url_regexp(),
AutomagicListView.as_view(model=model_class),
name=self.get_index_url_alias()
),
url(
self.get_absolute_url_regexp(),
AutomagicDetailView.as_view(model=model_class),
name=self.get_absolute_url_alias()
),
url(
self.get_create_url_regexp(),
AutomagicCreateView.as_view(model=model_class),
name=self.get_create_url_alias()
),
url(
self.get_update_url_regexp(),
AutomagicUpdateView.as_view(model=model_class),
name=self.get_update_url_alias()
),
url(
self.get_delete_url_regexp(),
AutomagicDeleteView.as_view(model=model_class),
name=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$
'''
# From https://gist.github.com/spout/8179573#!
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
class AutomagicListView(ListView):
pass
class AutomagicDetailView(DetailView):
pass
class AutomagicCreateView(CreateView):
pass
class AutomagicUpdateView(UpdateView):
pass
class AutomagicDeleteView(DeleteView):
pass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment