Django

Code

Changeset 4416

Show
Ignore:
Timestamp:
01/24/07 11:18:21 (2 years ago)
Author:
adrian
Message:

newforms-admin: Implemented part of raw_id_admin and related-object popup window links for ForeignKey? and ManyToManyFields? in the admin

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/newforms-admin/django/contrib/admin/options.py

    r4408 r4416  
    208208            widget = widgets.FilteredSelectMultiple(db_field.verbose_name, db_field.rel.filter_interface-1) 
    209209            return db_field.formfield(widget=widget, **kwargs) 
     210 
    210211        # For DateTimeFields, use a special field and widget. 
    211212        if isinstance(db_field, models.DateTimeField): 
    212213            return forms.SplitDateTimeField(required=not db_field.blank, 
    213214                widget=widgets.AdminSplitDateTime(), label=capfirst(db_field.verbose_name), **kwargs) 
     215 
    214216        # For DateFields, add a custom CSS class. 
    215217        if isinstance(db_field, models.DateField): 
    216218            return db_field.formfield(widget=forms.TextInput(attrs={'class': 'vDateField', 'size': '10'})) 
     219 
    217220        # For TimeFields, add a custom CSS class. 
    218221        if isinstance(db_field, models.TimeField): 
    219222            return db_field.formfield(widget=forms.TextInput(attrs={'class': 'vTimeField', 'size': '8'})) 
     223 
     224        # For ForeignKey or ManyToManyFields, use a special widget. 
     225        if db_field.rel and isinstance(db_field.rel, (models.ManyToOneRel, models.ManyToManyRel)): 
     226            # Wrap the widget's render() method with a method that adds 
     227            # extra HTML to the end of the rendered output. 
     228            formfield = db_field.formfield() 
     229            formfield.widget.render = widgets.RelatedFieldWidgetWrapper(formfield.widget.render, db_field.rel) 
     230            return formfield 
     231 
     232        # For any other type of field, just call its formfield() method. 
    220233        return db_field.formfield(**kwargs) 
    221234 
  • django/branches/newforms-admin/django/contrib/admin/templates/widget/foreign.html

    r3352 r4416  
    11{% load admin_modify adminmedia %} 
    22{% output_all bound_field.form_fields %} 
    3 {% if bound_field.raw_id_admin %} 
    4     {% if bound_field.field.rel.limit_choices_to %} 
    5         <a href="{{ bound_field.related_url }}?{% for limit_choice in bound_field.field.rel.limit_choices_to.items %}{% if not forloop.first %}&amp;{% endif %}{{ limit_choice|join:"=" }}{% endfor %}" class="related-lookup" id="lookup_{{ bound_field.element_id }}" onclick="return showRelatedObjectLookupPopup(this);"> <img src="{% admin_media_prefix %}img/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a> 
    6     {% else %} 
    7         <a href="{{ bound_field.related_url }}" class="related-lookup" id="lookup_{{ bound_field.element_id }}" onclick="return showRelatedObjectLookupPopup(this);"> <img src="{% admin_media_prefix %}img/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a> 
    8     {% endif %} 
    9 {% else %} 
    10 {% if bound_field.needs_add_label %} 
    11     <a href="{{ bound_field.related_url }}add/" class="add-another" id="add_{{ bound_field.element_id }}" onclick="return showAddAnotherPopup(this);"> <img src="{% admin_media_prefix %}img/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"/></a> 
    12 {% endif %}{% endif %} 
    133{% if change %} 
    144    {% if bound_field.field.primary_key %} 
  • django/branches/newforms-admin/django/contrib/admin/views/main.py

    r4382 r4416  
    6464        self.original = original 
    6565        self.form_fields = [field_mapping[name] for name in self.field.get_manipulator_field_names('')] 
    66         self.element_id = self.form_fields[0].get_id() 
    6766        self.has_label_first = not isinstance(self.field, models.BooleanField) 
    6867        self.raw_id_admin = use_raw_id_admin(field) 
    6968        self.is_date_time = isinstance(field, models.DateTimeField) 
    7069        self.is_file_field = isinstance(field, models.FileField) 
    71         self.needs_add_label = field.rel and (isinstance(field.rel, models.ManyToOneRel) or isinstance(field.rel, models.ManyToManyRel)) and field.rel.to._meta.admin 
    7270        self.hidden = isinstance(self.field, models.AutoField) 
    7371        self.first = False 
     
    8179            self.cell_class_attribute = ' class="%s" ' % ' '.join(classes) 
    8280        self._repr_filled = False 
    83  
    84         if field.rel: 
    85             self.related_url = '../../../%s/%s/' % (field.rel.to._meta.app_label, field.rel.to._meta.object_name.lower()) 
    8681 
    8782    def original_value(self): 
  • django/branches/newforms-admin/django/contrib/admin/widgets.py

    r4407 r4416  
    4141        return u'<p class="datetime">%s %s<br />%s %s</p>' % \ 
    4242            (_('Date:'), rendered_widgets[0], _('Time:'), rendered_widgets[1]) 
     43 
     44class RelatedFieldWidgetWrapper(object): 
     45    """ 
     46    This class is a wrapper whose __call__() method mimics the interface of a 
     47    Widget's render() method. 
     48    """ 
     49    def __init__(self, render_func, rel): 
     50        self.render_func, self.rel = render_func, rel 
     51 
     52    def __call__(self, name, value, *args, **kwargs): 
     53        from django.conf import settings 
     54        rel_to = self.rel.to 
     55        related_url = '../../../%s/%s/' % (rel_to._meta.app_label, rel_to._meta.object_name.lower()) 
     56        output = [self.render_func(name, value, *args, **kwargs)] 
     57        if self.rel.raw_id_admin: 
     58            if self.rel.limit_choices_to: 
     59                url = '?' + '&amp;'.join(['%s=%s' % (k, v) for k, v in self.rel.limit_choices_to.items()]) 
     60            else: 
     61                url = '' 
     62            # TODO: "id_" is hard-coded here. This should instead use the correct 
     63            # API to determine the ID dynamically. 
     64            output.append('<a href="%s%s" class="related-lookup" id="lookup_id_%s" onclick="return showRelatedObjectLookupPopup(this);"> ' % \ 
     65                (related_url, url, name)) 
     66            output.append('<img src="%simg/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a>' % settings.ADMIN_MEDIA_PREFIX) 
     67            #if self.change: # TODO 
     68                #output.append('&nbsp;<strong>TODO</strong>') 
     69        elif rel_to._meta.admin: # If the related object has an admin interface: 
     70            # TODO: "id_" is hard-coded here. This should instead use the correct 
     71            # API to determine the ID dynamically. 
     72            output.append(u'<a href="%sadd/" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' % \ 
     73                (related_url, name)) 
     74            output.append(u'<img src="%simg/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"/></a>' % settings.ADMIN_MEDIA_PREFIX) 
     75        return u''.join(output)