From 39e63513a8e74716d8fd98c23b6301e824c8e042 Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Thu, 25 Jan 2007 18:05:10 +0000 Subject: [PATCH] newforms-admin: Backwards-incompatible change: Refactored raw_id_admin. It is no longer a valid attribute for fields. Instead, specify 'raw_id_fields', a list of field names, in the 'class Admin'. Also removed raw_id functionality for ManyToManyFields, as it was hackish. git-svn-id: http://code.djangoproject.com/svn/django/branches/newforms-admin@4430 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- .../media/js/admin/RelatedObjectLookups.js | 2 +- django/contrib/admin/options.py | 17 ++-- django/contrib/admin/widgets.py | 43 +++++++--- django/contrib/comments/models.py | 3 +- django/db/models/fields/generic.py | 43 +++++----- django/db/models/fields/related.py | 83 ++++++------------- django/db/models/manipulators.py | 7 +- 7 files changed, 91 insertions(+), 107 deletions(-) diff --git a/django/contrib/admin/media/js/admin/RelatedObjectLookups.js b/django/contrib/admin/media/js/admin/RelatedObjectLookups.js index db4ed1a9d1..f50ff43c91 100644 --- a/django/contrib/admin/media/js/admin/RelatedObjectLookups.js +++ b/django/contrib/admin/media/js/admin/RelatedObjectLookups.js @@ -1,4 +1,4 @@ -// Handles related-objects functionality: lookup link for raw_id_admin=True +// Handles related-objects functionality: lookup link for raw_id_fields // and Add Another links. function showRelatedObjectLookupPopup(triggeringLink) { diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index e681e23440..946e074624 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -108,6 +108,7 @@ class ModelAdmin(object): ordering = None js = None fields = None + raw_id_fields = () def __init__(self, model): self.model = model @@ -224,12 +225,16 @@ class ModelAdmin(object): return db_field.formfield(**kwargs) # For ForeignKey or ManyToManyFields, use a special widget. - if db_field.rel and isinstance(db_field.rel, (models.ManyToOneRel, models.ManyToManyRel)): - # Wrap the widget's render() method with a method that adds - # extra HTML to the end of the rendered output. - formfield = db_field.formfield(**kwargs) - formfield.widget.render = widgets.RelatedFieldWidgetWrapper(formfield.widget.render, db_field.rel) - return formfield + if isinstance(db_field, (models.ForeignKey, models.ManyToManyField)): + if isinstance(db_field, models.ForeignKey) and db_field.name in self.raw_id_fields: + kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.rel) + return db_field.formfield(**kwargs) + else: + # Wrap the widget's render() method with a method that adds + # extra HTML to the end of the rendered output. + formfield = db_field.formfield(**kwargs) + formfield.widget.render = widgets.RelatedFieldWidgetWrapper(formfield.widget.render, db_field.rel) + return formfield # For any other type of field, just call its formfield() method. return db_field.formfield(**kwargs) diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py index 1a2abe85ce..62c6a450b7 100644 --- a/django/contrib/admin/widgets.py +++ b/django/contrib/admin/widgets.py @@ -3,6 +3,8 @@ Form Widget classes specific to the Django admin site. """ from django import newforms as forms +from django.newforms.util import smart_unicode +from django.utils.text import capfirst class FilteredSelectMultiple(forms.SelectMultiple): """ @@ -41,6 +43,33 @@ class AdminSplitDateTime(forms.SplitDateTimeWidget): return u'

%s %s
%s %s

' % \ (_('Date:'), rendered_widgets[0], _('Time:'), rendered_widgets[1]) +class ForeignKeyRawIdWidget(forms.TextInput): + """ + A Widget for displaying ForeignKeys in the "raw_id" interface rather than + in a