Django

Code

Changeset 6310

Show
Ignore:
Timestamp:
09/15/07 13:53:31 (1 year ago)
Author:
jkocherhans
Message:

newforms-admin: Fixed #5407. Javascript problems with raw_id fields. Thanks Christian Metts.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/newforms-admin/AUTHORS

    r6128 r6310  
    202202    Jason McBrayer <http://www.carcosa.net/jason/> 
    203203    mccutchen@gmail.com 
     204    Christian Metts 
    204205    michael.mcewan@gmail.com 
    205206    mikko@sorl.net 
  • django/branches/newforms-admin/django/contrib/admin/media/js/admin/RelatedObjectLookups.js

    r5828 r6310  
    2020    var name = win.name.replace(/___/g, '.'); 
    2121    var elem = document.getElementById(name); 
    22     if (elem.className.indexOf('vRawIdAdminField') != -1 && elem.value) { 
     22    if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) { 
    2323        elem.value += ',' + chosenId; 
    2424    } else { 
  • django/branches/newforms-admin/django/contrib/admin/options.py

    r6239 r6310  
    169169            if isinstance(db_field, models.ForeignKey) and db_field.name in self.raw_id_fields: 
    170170                kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.rel) 
    171                 return db_field.formfield(**kwargs) 
    172171            else: 
    173                 # Wrap the widget's render() method with a method that adds 
    174                 # extra HTML to the end of the rendered output. 
    175                 formfield = db_field.formfield(**kwargs) 
     172                if isinstance(db_field, models.ManyToManyField) and db_field.name in self.raw_id_fields: 
     173                    kwargs['widget'] = widgets.ManyToManyRawIdWidget(db_field.rel) 
     174                    kwargs['help_text'] = '' 
     175            # Wrap the widget's render() method with a method that adds 
     176            # extra HTML to the end of the rendered output. 
     177            formfield = db_field.formfield(**kwargs) 
     178            # Don't wrap raw_id fields. Their add function is in the popup window. 
     179            if not db_field.name in self.raw_id_fields: 
    176180                formfield.widget.render = widgets.RelatedFieldWidgetWrapper(formfield.widget.render, db_field.rel, self.admin_site) 
    177                 return formfield 
     181            return formfield 
    178182 
    179183        # For any other type of field, just call its formfield() method. 
  • django/branches/newforms-admin/django/contrib/admin/widgets.py

    r6074 r6310  
    44 
    55from django import newforms as forms 
     6from django.utils.datastructures import MultiValueDict 
    67from django.utils.text import capfirst 
    78from django.utils.translation import ugettext as _ 
     
    7677        else: 
    7778            url = '' 
    78         attrs['class'] = 'vRawIdAdminField' # The JavaScript looks for this hook. 
     79        if not attrs.has_key('class'): 
     80          attrs['class'] = 'vForeignKeyRawIdAdminField' # The JavaScript looks for this hook. 
    7981        output = [super(ForeignKeyRawIdWidget, self).render(name, value, attrs)] 
    8082        # TODO: "id_" is hard-coded here. This should instead use the correct 
     
    8688        #if self.change: # TODO 
    8789            #output.append('&nbsp;<strong>TODO</strong>') 
     90             
     91class ManyToManyRawIdWidget(ForeignKeyRawIdWidget): 
     92    """ 
     93    A Widget for displaying ManyToMany ids in the "raw_id" interface rather than 
     94    in a <select multiple> box. 
     95    """ 
     96    def __init__(self, rel, attrs=None): 
     97        super(ManyToManyRawIdWidget, self).__init__(rel, attrs) 
     98     
     99    def render(self, name, value, attrs=None): 
     100        attrs['class'] = 'vManyToManyRawIdAdminField' 
     101        if value:  
     102            value = ','.join(value) 
     103        else:  
     104            value = "" 
     105        return super(ManyToManyRawIdWidget, self).render(name, value, attrs) 
     106 
     107    def value_from_datadict(self, data, files, name): 
     108        if isinstance(data, MultiValueDict): 
     109            return data[name].split(',') 
     110        return data.get(name, None) 
    88111 
    89112class RelatedFieldWidgetWrapper(object):