from django.contrib.admin.widgets import ManyToManyRawIdWidget
from django.utils.encoding import smart_unicode
from django.utils.html import escape
class VerboseManyToManyRawIdWidget(ManyToManyRawIdWidget):
"""
A Widget for displaying ManyToMany ids in the "raw_id" interface rather than
in a <select multiple> box.
Display user-friendly value like the ForeignKeyRawId widget
"""
def __init__(self, rel, attrs=None):
self._rel = rel
super(VerboseManyToManyRawIdWidget, self).__init__(rel, attrs)
def label_for_value(self, value):
values = value.split(',')
str_values = []
key = self.rel.get_related_field().name
for v in values:
try:
obj = self.rel.to._default_manager.using(self.db).get(**{key: v})
# manage unicode error
x = smart_unicode(obj)
# no HTML
str_values += [escape(x)]
except self.rel.to.DoesNotExist:
str_values += [u'???']
return u' <strong>%s</strong>' % (u', '.join(str_values))
class MyAdmin(admin.ModelAdmin):
...
def formfield_for_dbfield(self, db_field, **kwargs):
if db_field.name in ('groups',):
kwargs.pop('request', None)
kwargs['widget'] = VerboseManyToManyRawIdWidget(db_field.rel)
return db_field.formfield(**kwargs)
return super(MyAdmin,self).formfield_for_dbfield(db_field,**kwargs)
Comments
Updated: Use smart_unicode rather than unicodedata.normalize
#
I've posted an updated version of this widget here: http://djangosnippets.org/snippets/2217/
It adds links to each object's change page, and also works for ForeignKeys.
#