web/lib/django/contrib/admin/widgets.py
changeset 29 cc9b7e14412b
parent 0 0d40e90630ef
equal deleted inserted replaced
28:b758351d191f 29:cc9b7e14412b
     1 """
     1 """
     2 Form Widget classes specific to the Django admin site.
     2 Form Widget classes specific to the Django admin site.
     3 """
     3 """
     4 
     4 
     5 import copy
     5 import django.utils.copycompat as copy
     6 
     6 
     7 from django import forms
     7 from django import forms
     8 from django.forms.widgets import RadioFieldRenderer
     8 from django.forms.widgets import RadioFieldRenderer
     9 from django.forms.util import flatatt
     9 from django.forms.util import flatatt
    10 from django.utils.html import escape
    10 from django.utils.html import escape
    31         self.verbose_name = verbose_name
    31         self.verbose_name = verbose_name
    32         self.is_stacked = is_stacked
    32         self.is_stacked = is_stacked
    33         super(FilteredSelectMultiple, self).__init__(attrs, choices)
    33         super(FilteredSelectMultiple, self).__init__(attrs, choices)
    34 
    34 
    35     def render(self, name, value, attrs=None, choices=()):
    35     def render(self, name, value, attrs=None, choices=()):
       
    36         if attrs is None: attrs = {}
       
    37         attrs['class'] = 'selectfilter'
       
    38         if self.is_stacked: attrs['class'] += 'stacked'
    36         output = [super(FilteredSelectMultiple, self).render(name, value, attrs, choices)]
    39         output = [super(FilteredSelectMultiple, self).render(name, value, attrs, choices)]
    37         output.append(u'<script type="text/javascript">addEvent(window, "load", function(e) {')
    40         output.append(u'<script type="text/javascript">addEvent(window, "load", function(e) {')
    38         # TODO: "id_" is hard-coded here. This should instead use the correct
    41         # TODO: "id_" is hard-coded here. This should instead use the correct
    39         # API to determine the ID dynamically.
    42         # API to determine the ID dynamically.
    40         output.append(u'SelectFilter.init("id_%s", "%s", %s, "%s"); });</script>\n' % \
    43         output.append(u'SelectFilter.init("id_%s", "%s", %s, "%s"); });</script>\n' % \
    41             (name, self.verbose_name.replace('"', '\\"'), int(self.is_stacked), settings.ADMIN_MEDIA_PREFIX))
    44             (name, self.verbose_name.replace('"', '\\"'), int(self.is_stacked), settings.ADMIN_MEDIA_PREFIX))
    42         return mark_safe(u''.join(output))
    45         return mark_safe(u''.join(output))
    43 
    46 
    44 class AdminDateWidget(forms.TextInput):
    47 class AdminDateWidget(forms.DateTimeInput):
    45     class Media:
    48     class Media:
    46         js = (settings.ADMIN_MEDIA_PREFIX + "js/calendar.js",
    49         js = (settings.ADMIN_MEDIA_PREFIX + "js/calendar.js",
    47               settings.ADMIN_MEDIA_PREFIX + "js/admin/DateTimeShortcuts.js")
    50               settings.ADMIN_MEDIA_PREFIX + "js/admin/DateTimeShortcuts.js")
    48 
    51 
    49     def __init__(self, attrs={}):
    52     def __init__(self, attrs={}, format=None):
    50         super(AdminDateWidget, self).__init__(attrs={'class': 'vDateField', 'size': '10'})
    53         super(AdminDateWidget, self).__init__(attrs={'class': 'vDateField', 'size': '10'}, format=format)
    51 
    54 
    52 class AdminTimeWidget(forms.TextInput):
    55 class AdminTimeWidget(forms.TimeInput):
    53     class Media:
    56     class Media:
    54         js = (settings.ADMIN_MEDIA_PREFIX + "js/calendar.js",
    57         js = (settings.ADMIN_MEDIA_PREFIX + "js/calendar.js",
    55               settings.ADMIN_MEDIA_PREFIX + "js/admin/DateTimeShortcuts.js")
    58               settings.ADMIN_MEDIA_PREFIX + "js/admin/DateTimeShortcuts.js")
    56 
    59 
    57     def __init__(self, attrs={}):
    60     def __init__(self, attrs={}, format=None):
    58         super(AdminTimeWidget, self).__init__(attrs={'class': 'vTimeField', 'size': '8'})
    61         super(AdminTimeWidget, self).__init__(attrs={'class': 'vTimeField', 'size': '8'}, format=format)
    59 
    62 
    60 class AdminSplitDateTime(forms.SplitDateTimeWidget):
    63 class AdminSplitDateTime(forms.SplitDateTimeWidget):
    61     """
    64     """
    62     A SplitDateTime Widget that has some admin-specific styling.
    65     A SplitDateTime Widget that has some admin-specific styling.
    63     """
    66     """
   100 class ForeignKeyRawIdWidget(forms.TextInput):
   103 class ForeignKeyRawIdWidget(forms.TextInput):
   101     """
   104     """
   102     A Widget for displaying ForeignKeys in the "raw_id" interface rather than
   105     A Widget for displaying ForeignKeys in the "raw_id" interface rather than
   103     in a <select> box.
   106     in a <select> box.
   104     """
   107     """
   105     def __init__(self, rel, attrs=None):
   108     def __init__(self, rel, attrs=None, using=None):
   106         self.rel = rel
   109         self.rel = rel
       
   110         self.db = using
   107         super(ForeignKeyRawIdWidget, self).__init__(attrs)
   111         super(ForeignKeyRawIdWidget, self).__init__(attrs)
   108 
   112 
   109     def render(self, name, value, attrs=None):
   113     def render(self, name, value, attrs=None):
   110         if attrs is None:
   114         if attrs is None:
   111             attrs = {}
   115             attrs = {}
   127             output.append(self.label_for_value(value))
   131             output.append(self.label_for_value(value))
   128         return mark_safe(u''.join(output))
   132         return mark_safe(u''.join(output))
   129 
   133 
   130     def base_url_parameters(self):
   134     def base_url_parameters(self):
   131         params = {}
   135         params = {}
   132         if self.rel.limit_choices_to:
   136         if self.rel.limit_choices_to and hasattr(self.rel.limit_choices_to, 'items'):
   133             items = []
   137             items = []
   134             for k, v in self.rel.limit_choices_to.items():
   138             for k, v in self.rel.limit_choices_to.items():
   135                 if isinstance(v, list):
   139                 if isinstance(v, list):
   136                     v = ','.join([str(x) for x in v])
   140                     v = ','.join([str(x) for x in v])
   137                 else:
   141                 else:
   146         params.update({TO_FIELD_VAR: self.rel.get_related_field().name})
   150         params.update({TO_FIELD_VAR: self.rel.get_related_field().name})
   147         return params
   151         return params
   148 
   152 
   149     def label_for_value(self, value):
   153     def label_for_value(self, value):
   150         key = self.rel.get_related_field().name
   154         key = self.rel.get_related_field().name
   151         obj = self.rel.to._default_manager.get(**{key: value})
   155         try:
       
   156             obj = self.rel.to._default_manager.using(self.db).get(**{key: value})
       
   157         except self.rel.to.DoesNotExist:
       
   158             return ''
   152         return '&nbsp;<strong>%s</strong>' % escape(truncate_words(obj, 14))
   159         return '&nbsp;<strong>%s</strong>' % escape(truncate_words(obj, 14))
   153 
   160 
   154 class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
   161 class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
   155     """
   162     """
   156     A Widget for displaying ManyToMany ids in the "raw_id" interface rather than
   163     A Widget for displaying ManyToMany ids in the "raw_id" interface rather than
   157     in a <select multiple> box.
   164     in a <select multiple> box.
   158     """
   165     """
   159     def __init__(self, rel, attrs=None):
   166     def __init__(self, rel, attrs=None, using=None):
   160         super(ManyToManyRawIdWidget, self).__init__(rel, attrs)
   167         super(ManyToManyRawIdWidget, self).__init__(rel, attrs, using=None)
   161 
   168 
   162     def render(self, name, value, attrs=None):
   169     def render(self, name, value, attrs=None):
   163         attrs['class'] = 'vManyToManyRawIdAdminField'
   170         attrs['class'] = 'vManyToManyRawIdAdminField'
   164         if value:
   171         if value:
   165             value = ','.join([str(v) for v in value])
   172             value = ','.join([str(v) for v in value])