Merge pull request #57 from AndrewIngram/custom-form-classes

Custom form classes
This commit is contained in:
Daniel Greenfeld 2013-05-18 08:23:22 -07:00
commit 80512305e4
6 changed files with 86 additions and 23 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):
@ -29,19 +33,25 @@ class Admin2(object):
continue
raise e
def get_index_kwargs(self):
return {
'registry': self.registry,
}
def get_urls(self):
urlpatterns = patterns('',
url(r'^$', self.index_view.as_view(), name='index'),
url(r'^$', self.index_view.as_view(**self.get_index_kwargs()), name='index'),
)
for model, modeladmin in self.registry.iteritems():
app_label = model._meta.app_label
model_name = model._meta.object_name.lower()
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 = {}
@ -75,6 +75,11 @@ class ModelAdmin2(BaseAdmin2):
search_fields = ()
save_as = False
save_on_top = False
verbose_name = None
verbose_name_plural = None
create_form_class = None
update_form_class = None
# Views
index_view = views.ModelListView
@ -86,31 +91,65 @@ class ModelAdmin2(BaseAdmin2):
def __init__(self, model, **kwargs):
self.model = model
if self.verbose_name is None:
self.verbose_name = self.model._meta.verbose_name
if self.verbose_name_plural is None:
self.verbose_name_plural = self.model._meta.verbose_name_plural
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

@ -2,11 +2,9 @@
{% block content %}
<h1>Index</h1>
{{ object_list }}
<table>
{% for obj in object_list %}
<tr><td>{{ obj.app_name }}</td></tr>
{% for modeladmin in registry.values %}
<tr><td>{{ modeladmin.verbose_name_plural }}</td></tr>
{% endfor %}
</table>
{% endblock content %}

View file

@ -7,11 +7,12 @@ from django.db import models
from braces.views import LoginRequiredMixin, StaffuserRequiredMixin
from .utils import get_admin2s
ADMIN2_THEME_DIRECTORY = getattr(settings, "ADMIN2_THEME_DIRECTORY", "admin2/bootstrap")
class Admin2Mixin(object):
modeladmin = None
def get_template_names(self):
return [os.path.join(ADMIN2_THEME_DIRECTORY, self.default_template_name)]
@ -27,12 +28,16 @@ class Admin2Mixin(object):
return modelform_factory(self.get_model())
class IndexView(Admin2Mixin, generic.ListView):
class IndexView(Admin2Mixin, generic.TemplateView):
default_template_name = "index.html"
registry = None
def get_queryset(self):
return get_admin2s()
def get_context_data(self, **kwargs):
data = super(IndexView, self).get_context_data(**kwargs)
data.update({
'registry': self.registry
})
return data
class ModelListView(Admin2Mixin, generic.ListView):
default_template_name = "model_list.html"

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()