Upload
djangocon2008
View
2.150
Download
1
Tags:
Embed Size (px)
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.
Resources
• http://github.com/jezdez/django-mobileadmin/
• http://docs.djangoproject.com/en/dev/ref/contrib/admin/
• http://oebfare.com
Questions?