What’S New In Newforms Admin

Preview:

DESCRIPTION

 

Citation preview

What’s New in newforms-admin

Brian RosnerDjangoCon 2008

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.

What has changed?

• No longer specify admin options in your model or model fields.

# models.pyfrom 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’,)

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.

# admin.pyfrom django.contrib import adminfrom myproject.myapps.models import Article

class ArticleAdmin(admin.ModelAdmin): list_display = (‘title’,) prepopulated_fields = {‘slug’: (‘title’,)}

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.

# admin.pyfrom django.contrib import adminfrom myproject.myapps.models import Article

class ArticleAdmin(admin.ModelAdmin): list_display = (‘title’,) prepopulated_fields = {‘slug’: (‘title’,)}

admin.site.register(Article, ArticleAdmin)

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.

# urls.pyfrom django.conf.urls.defaults import *from django.contrib import admin

admin.autodiscover()

urlpatterns = patterns(‘’, url(r’^admin/(.*)’, admin.site.root),)

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.

# models.pyfrom 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)

# admin.pyfrom django.contrib import adminfrom myproject.myapps.models import Author, Book

class BookInline(admin.StackedInline): model = Book

class AuthorAdmin(admin.ModelAdmin): inlines = [BookInline]

admin.site.register(Author, AuthorAdmin)

TabularInline

What is new?

• Formsets

• Model formsets

• Generic Inlines

• Media definitions on forms and widgets

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

# forms.pyfrom django import formsfrom django.forms.formsets import formset_factory

class BookForm(forms.Form): name = forms.CharField()

BookFormSet = formset_factory(BookForm)

# views.pyfrom django.shortcuts import render_to_responsefrom django.template import RequestContextfrom 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)

{# books.html #}<form method=”POST” action=””>{% for form in formset.forms %} {{ form }}{% endfor %}</form>

Model formsets

• Helpers for integration with models.

• BaseModelFormSet and BaseInlineFormSet

• modelformset_factory and inlineformset_factory

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

# models.pyfrom django.db import modelsfrom django.contrib.contenttypes import genricfrom 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’)

# admin.pyfrom django.contrib.contenttypes import genericfrom myproject.myapp.models import Image

class ImageInline(generic.GenericInlineModelAdmin): model = Image ct_field = ‘content_type’ ct_fk_field = ‘object_pk’

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

class CalendarWidget(forms.TextInput): class Media: css = {‘all’: (‘pretty.css’,)} js = (‘animations.js’, ‘actions.js’)

>>> w = CalendarWidget()>>> print w.media<link href=’http://media.example.com/pretty.css’ type=’text/css’ media=’all’ rel=’stylesheet /><script type=’text/javascript’ src=’http://media.example.com/animatation.js’></script><script type=’text/javascript’ src=’http://media.example.com/actions.js’></script>

And one more thing

• Formsets need to determine if a widget has changed data.

• Uses form.has_changed and form.changed_data.

Questions?

Recommended