2. What is it?
• A branch of Django trunk that refactored
django.contrib.admin to use newforms.
• Many API improvements, model decoupling
and new features.
• Landed in trunk at revision 7967.
• A part of Django 1.0.
3.
4. What has changed?
• No longer specify admin options in your
model or model fields.
5. # models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=50)
slug = models.SlugField(
prepopulate_fields=(‘title’,))
class Admin:
list_display = (‘title’,)
6. What has changed?
• No longer specify admin options in your
model or model fields.
• Use an admin.py module at application level
to define your ModelAdmin classes.
7. # admin.py
from django.contrib import admin
from myproject.myapps.models import Article
class ArticleAdmin(admin.ModelAdmin):
list_display = (‘title’,)
prepopulated_fields = {‘slug’: (‘title’,)}
8. What has changed?
• No longer specify admin options in your
model or model fields.
• Use an admin.py module at application level
to define your ModelAdmin classes.
• Register ModelAdmin classes to an
AdminSite instance.
9. # admin.py
from django.contrib import admin
from myproject.myapps.models import Article
class ArticleAdmin(admin.ModelAdmin):
list_display = (‘title’,)
prepopulated_fields = {‘slug’: (‘title’,)}
admin.site.register(Article, ArticleAdmin)
10. What has changed?
• No longer specify admin options in your
model or model fields.
• Use an admin.py module at application level
to define your ModelAdmin classes.
• Register ModelAdmin classes to an
AdminSite instance.
• Hook up AdminSite instances in your
URLconf.
11. # urls.py
from django.conf.urls.defaults import *
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns(‘’,
url(r’^admin/(.*)’, admin.site.root),
)
12. edit_inline change
• edit_inline has been completely refactored.
• Inlines now subclass InlineModelAdmin.
• InlineModelAdmin inherits from
BaseModelAdmin.
• Django provides StackedInline and
TabularInline out of the box.
13. # models.py
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=50)
class Admin:
pass
class Book(models.Model):
author = models.ForeignKey(Author,
edit_inline=models.STACKED)
title = models.CharField(max_length=50,
core=True)
14. # admin.py
from django.contrib import admin
from myproject.myapps.models import Author, Book
class BookInline(admin.StackedInline):
model = Book
class AuthorAdmin(admin.ModelAdmin):
inlines = [BookInline]
admin.site.register(Author, AuthorAdmin)
16. What is new?
• Formsets
• Model formsets
• Generic Inlines
• Media definitions on forms and widgets
17. Formsets
• Provides a simple API for handling more
than one like form on the same page.
• The underlying implementation of inlines.
• django.forms.formsets.formset_factory
18. # forms.py
from django import forms
from django.forms.formsets import formset_factory
class BookForm(forms.Form):
name = forms.CharField()
BookFormSet = formset_factory(BookForm)
19. # views.py
from django.shortcuts import render_to_response
from django.template import RequestContext
from myproject.myapp.forms import BookFormSet
def books(request):
if request.method == ‘POST’:
formset = BookFormSet(request.POST)
if formset.is_valid():
# do something
else:
formset = BookFormSet()
return render_to_response(‘books.html’, {
‘formset’: formset,
}, context_instance=RequestContext(request)
20. {# books.html #}
<form method=”POST” action=””>
{% for form in formset.forms %}
{{ form }}
{% endfor %}
</form>
21. Model formsets
• Helpers for integration with models.
• BaseModelFormSet and BaseInlineFormSet
• modelformset_factory and
inlineformset_factory
22. Generic Inlines
• Inlines based on a generic foreign key.
• Allows for a reusable inline that can be
applied generically to ModelAdmin classes.
• GenericInlineModelAdmin
• GenericTabularInline and
GenericStackedInline
23. # models.py
from django.db import models
from django.contrib.contenttypes import genric
from django.contrib.contenttypes.models import *
class Image(models.Model):
image = models.ImageField(upload_to=’images’)
object_pk = models.PositiveIntegerField()
content_type = models.ForeignKey(ContentType)
content_object = GenericForeignKey(
‘content_type’, ‘object_pk’)
24. # admin.py
from django.contrib.contenttypes import generic
from myproject.myapp.models import Image
class ImageInline(generic.GenericInlineModelAdmin):
model = Image
ct_field = ‘content_type’
ct_fk_field = ‘object_pk’
25. Media definitions
• Define media on forms and widgets.
• Allows for simple reusable widgets.
• Admin widgets use this so they can be used
outside the admin.
• Applies to ModelAdmin and
InlineModelAdmin