from django.conf import settings from django.db import models from django.core.files.storage import default_storage class Member(models.Model): name = models.CharField(max_length=100) def __unicode__(self): return self.name class Band(models.Model): name = models.CharField(max_length=100) members = models.ManyToManyField(Member) def __unicode__(self): return self.name class Album(models.Model): band = models.ForeignKey(Band) name = models.CharField(max_length=100) cover_art = models.FileField(upload_to='albums') def __unicode__(self): return self.name __test__ = {'WIDGETS_TESTS': """ >>> from datetime import datetime >>> from django.utils.html import escape, conditional_escape >>> from django.core.files.uploadedfile import SimpleUploadedFile >>> from django.contrib.admin.widgets import FilteredSelectMultiple, AdminSplitDateTime >>> from django.contrib.admin.widgets import AdminFileWidget, ForeignKeyRawIdWidget, ManyToManyRawIdWidget >>> from django.contrib.admin.widgets import RelatedFieldWidgetWrapper Calling conditional_escape on the output of widget.render will simulate what happens in the template. This is easier than setting up a template and context for each test. Make sure that the Admin widgets render properly, that is, without their extra HTML escaped. >>> w = FilteredSelectMultiple('test', False) >>> print conditional_escape(w.render('test', 'test')) >>> w = AdminSplitDateTime() >>> print conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30)))

Date:
Time:

>>> band = Band.objects.create(pk=1, name='Linkin Park') >>> album = band.album_set.create(name='Hybrid Theory', cover_art=r'albums\hybrid_theory.jpg') >>> w = AdminFileWidget() >>> print conditional_escape(w.render('test', album.cover_art)) Currently: albums\hybrid_theory.jpg
Change: >>> print conditional_escape(w.render('test', SimpleUploadedFile('test', 'content'))) >>> rel = Album._meta.get_field('band').rel >>> w = ForeignKeyRawIdWidget(rel) >>> print conditional_escape(w.render('test', band.pk, attrs={})) Lookup Linkin Park >>> m1 = Member.objects.create(pk=1, name='Chester') >>> m2 = Member.objects.create(pk=2, name='Mike') >>> band.members.add(m1, m2) >>> rel = Band._meta.get_field('members').rel >>> w = ManyToManyRawIdWidget(rel) >>> print conditional_escape(w.render('test', [m1.pk, m2.pk], attrs={})) Lookup >>> w._has_changed(None, None) False >>> w._has_changed([], None) False >>> w._has_changed(None, [u'1']) True >>> w._has_changed([1, 2], [u'1', u'2']) False >>> w._has_changed([1, 2], [u'1']) True >>> w._has_changed([1, 2], [u'1', u'3']) True """ % { 'ADMIN_MEDIA_PREFIX': settings.ADMIN_MEDIA_PREFIX, 'STORAGE_URL': default_storage.url(''), }}