custom form class support

Also sets framework for adding kwargs to any admin2 view
This commit is contained in:
Andrew Ingram 2013-05-18 16:59:06 +02:00
parent 8f64972fd5
commit 24bfdab8a6
4 changed files with 65 additions and 13 deletions

View file

@ -10,10 +10,14 @@ from . import views
class Admin2(object):
index_view = views.IndexView
def __init__(self):
def __init__(self, name='admin2', app_name='admin2'):
self.registry = {}
self.name = name
self.app_name = app_name
def register(self, model, modeladmin=models.ModelAdmin2, **kwargs):
def register(self, model, modeladmin=None, **kwargs):
if not modeladmin:
modeladmin = models.ModelAdmin2
self.registry[model] = modeladmin(model, **kwargs)
def deregister(self, model):
@ -34,14 +38,18 @@ class Admin2(object):
url(r'^$', self.index_view.as_view(), name='index'),
)
for model, modeladmin in self.registry.iteritems():
app_label = model._meta.app_label
model_name = model._meta.object_name.lower()
app_name = '{}:{}:{}'.format(self.app_name, app_label, model_name)
namespace = '{}:{}:{}'.format(self.name, app_label, model_name)
urlpatterns += patterns('',
url('^{}/{}/'.format(model._meta.app_label, model._meta.object_name.lower()),
url('^{}/{}/'.format(app_label, model_name),
include(modeladmin.urls)),
)
return urlpatterns
@property
def urls(self):
# We set the application and instance namespace here
return self.get_urls(), None, None
return self.get_urls(), self.app_name, self.name

View file

@ -35,7 +35,7 @@ class BaseAdmin2(object):
fields = None
exclude = None
fieldsets = None
form = forms.ModelForm
form_class = None
filter_vertical = ()
filter_horizontal = ()
radio_fields = {}
@ -76,6 +76,10 @@ class ModelAdmin2(BaseAdmin2):
save_as = False
save_on_top = False
create_form_class = None
update_form_class = None
# Views
index_view = views.ModelListView
create_view = views.ModelAddFormView
@ -86,31 +90,60 @@ class ModelAdmin2(BaseAdmin2):
def __init__(self, model, **kwargs):
self.model = model
def get_default_view_kwargs(self):
return {
'model': self.model,
'modeladmin': self,
}
def get_index_kwargs(self):
return self.get_default_view_kwargs()
def get_create_kwargs(self):
kwargs = self.get_default_view_kwargs()
kwargs.update({
'form_class': self.create_form_class if self.create_form_class else self.form_class,
})
return kwargs
def get_update_kwargs(self):
kwargs = self.get_default_view_kwargs()
kwargs.update({
'form_class': self.update_form_class if self.update_form_class else self.form_class,
})
return kwargs
def get_detail_kwargs(self):
return self.get_default_view_kwargs()
def get_delete_kwargs(self):
return self.get_default_view_kwargs()
def get_urls(self):
return patterns('',
url(
regex=r'^$',
view=self.index_view.as_view(model=self.model),
view=self.index_view.as_view(**self.get_index_kwargs()),
name='index'
),
url(
regex=r'^create/$',
view=self.create_view.as_view(model=self.model),
view=self.create_view.as_view(**self.get_create_kwargs()),
name='create'
),
url(
regex=r'^(?P<pk>[0-9]+)/$',
view=self.detail_view.as_view(model=self.model),
view=self.detail_view.as_view(**self.get_detail_kwargs()),
name='detail'
),
url(
regex=r'^(?P<pk>[0-9]+)/update/$',
view=self.update_view.as_view(model=self.model),
view=self.update_view.as_view(**self.get_update_kwargs()),
name='update'
),
url(
regex=r'^(?P<pk>[0-9]+)/delete/$',
view=self.delete_view.as_view(model=self.model),
view=self.delete_view.as_view(**self.get_delete_kwargs()),
name='delete'
),
)

View file

@ -1,11 +1,20 @@
# Import your custom models
from .models import Post, Comment
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django.contrib.auth.models import User
import djadmin2
from djadmin2.models import ModelAdmin2
class UserAdmin2(ModelAdmin2):
create_form_class = UserCreationForm
update_form_class = UserChangeForm
# Register each model with the admin
djadmin2.default.register(Post)
djadmin2.default.register(Comment)
djadmin2.default.register(User)
djadmin2.default.register(User, UserAdmin2)

View file

@ -1,5 +1,6 @@
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=255)
body = models.TextField()
@ -7,6 +8,7 @@ class Post(models.Model):
def __unicode__(self):
return self.title
class Comment(models.Model):
post = models.ForeignKey(Post)
body = models.TextField()