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 """ |
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 ' <strong>%s</strong>' % escape(truncate_words(obj, 14)) |
159 return ' <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]) |