mirror of
https://github.com/django/django.git
synced 2025-07-05 10:19:20 +00:00
newforms-admin: Added javascript(), javascript_add() and javascript_change() hooks to ModelAdmin. Removed legacy JavaScript-creating code.
git-svn-id: http://code.djangoproject.com/svn/django/branches/newforms-admin@4382 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
7895fa70eb
commit
259f083c24
@ -31,43 +31,6 @@ def unquote(s):
|
|||||||
myappend('_' + item)
|
myappend('_' + item)
|
||||||
return "".join(res)
|
return "".join(res)
|
||||||
|
|
||||||
class AdminFieldSet(object):
|
|
||||||
def __init__(self, name, classes, field_locator_func, field_list, description):
|
|
||||||
self.name = name
|
|
||||||
self.field_lines = [AdminFieldLine(field_locator_func, field) for field in field_list]
|
|
||||||
self.classes = classes
|
|
||||||
self.description = description
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "FieldSet: (%s, %s)" % (self.name, self.field_lines)
|
|
||||||
|
|
||||||
def bind(self, field_mapping, original, bound_field_set_class):
|
|
||||||
return bound_field_set_class(self, field_mapping, original)
|
|
||||||
|
|
||||||
def __iter__(self):
|
|
||||||
for field_line in self.field_lines:
|
|
||||||
yield field_line
|
|
||||||
|
|
||||||
def __len__(self):
|
|
||||||
return len(self.field_lines)
|
|
||||||
|
|
||||||
class AdminFieldLine(object):
|
|
||||||
def __init__(self, field_locator_func, field_name):
|
|
||||||
if isinstance(field_name, basestring):
|
|
||||||
self.fields = [field_locator_func(field_name)]
|
|
||||||
else:
|
|
||||||
self.fields = [field_locator_func(name) for name in field_name]
|
|
||||||
|
|
||||||
def bind(self, field_mapping, original, bound_field_line_class):
|
|
||||||
return bound_field_line_class(self, field_mapping, original)
|
|
||||||
|
|
||||||
def __iter__(self):
|
|
||||||
for field in self.fields:
|
|
||||||
yield field
|
|
||||||
|
|
||||||
def __len__(self):
|
|
||||||
return len(self.fields)
|
|
||||||
|
|
||||||
class AdminForm(object):
|
class AdminForm(object):
|
||||||
def __init__(self, form, fieldsets):
|
def __init__(self, form, fieldsets):
|
||||||
self.form, self.fieldsets = form, fieldsets
|
self.form, self.fieldsets = form, fieldsets
|
||||||
@ -174,19 +137,37 @@ class ModelAdmin(object):
|
|||||||
else:
|
else:
|
||||||
return self.change_view(request, unquote(url))
|
return self.change_view(request, unquote(url))
|
||||||
|
|
||||||
def get_field_sets(self):
|
def javascript(self, request, fieldsets):
|
||||||
"Returns a list of AdminFieldSet objects according to self.fields."
|
"""
|
||||||
opts = self.opts
|
Returns a list of URLs to include via <script> statements.
|
||||||
if self.fields is None:
|
"""
|
||||||
field_struct = ((None, {'fields': [f.name for f in opts.fields + opts.many_to_many if f.editable and not isinstance(f, models.AutoField)]}),)
|
from django.conf import settings
|
||||||
else:
|
js = ['js/core.js', 'js/admin/RelatedObjectLookups.js']
|
||||||
field_struct = self.fields
|
# TODO: This.
|
||||||
new_fieldset_list = []
|
#if auto_populated_fields:
|
||||||
for name, options in field_struct:
|
#js.append('js/urlify.js')
|
||||||
classes = options.get('classes', ())
|
if self.opts.has_field_type(models.DateTimeField) or self.opts.has_field_type(models.TimeField) or self.opts.has_field_type(models.DateField):
|
||||||
description = options.get('description', '')
|
js.extend(['js/calendar.js', 'js/admin/DateTimeShortcuts.js'])
|
||||||
new_fieldset_list.append(AdminFieldSet(name, classes, opts.get_field, options['fields'], description))
|
if self.opts.get_ordered_objects():
|
||||||
return new_fieldset_list
|
js.extend(['js/getElementsBySelector.js', 'js/dom-drag.js' , 'js/admin/ordering.js'])
|
||||||
|
if self.js:
|
||||||
|
js.extend(self.js)
|
||||||
|
for f in self.opts.many_to_many:
|
||||||
|
if f.rel.filter_interface:
|
||||||
|
js.extend(['js/SelectBox.js' , 'js/SelectFilter2.js'])
|
||||||
|
break
|
||||||
|
for fs in fieldsets:
|
||||||
|
if 'collapse' in fs.classes:
|
||||||
|
js.append('js/admin/CollapsedFieldsets.js')
|
||||||
|
break
|
||||||
|
prefix = settings.ADMIN_MEDIA_PREFIX
|
||||||
|
return ['%s%s' % (prefix, url) for url in js]
|
||||||
|
|
||||||
|
def javascript_add(self, request):
|
||||||
|
return self.javascript(request, self.fieldsets_add(request))
|
||||||
|
|
||||||
|
def javascript_change(self, request, object_id):
|
||||||
|
return self.javascript(request, self.fieldsets_change(request, object_id))
|
||||||
|
|
||||||
def fieldsets(self, request):
|
def fieldsets(self, request):
|
||||||
"""
|
"""
|
||||||
@ -297,6 +278,7 @@ class ModelAdmin(object):
|
|||||||
'oldform': oldforms.FormWrapper(model.AddManipulator(), {}, {}),
|
'oldform': oldforms.FormWrapper(model.AddManipulator(), {}, {}),
|
||||||
'is_popup': request.REQUEST.has_key('_popup'),
|
'is_popup': request.REQUEST.has_key('_popup'),
|
||||||
'show_delete': False,
|
'show_delete': False,
|
||||||
|
'javascript_imports': self.javascript_add(request),
|
||||||
})
|
})
|
||||||
|
|
||||||
return render_change_form(self, model, model.AddManipulator(), c, add=True)
|
return render_change_form(self, model, model.AddManipulator(), c, add=True)
|
||||||
@ -388,6 +370,7 @@ class ModelAdmin(object):
|
|||||||
'object_id': object_id,
|
'object_id': object_id,
|
||||||
'original': obj,
|
'original': obj,
|
||||||
'is_popup': request.REQUEST.has_key('_popup'),
|
'is_popup': request.REQUEST.has_key('_popup'),
|
||||||
|
'javascript_imports': self.javascript_change(request, object_id),
|
||||||
})
|
})
|
||||||
return render_change_form(self, model, model.ChangeManipulator(object_id), c, change=True)
|
return render_change_form(self, model, model.ChangeManipulator(object_id), c, change=True)
|
||||||
|
|
||||||
|
@ -3,7 +3,8 @@
|
|||||||
|
|
||||||
{% block extrahead %}{{ block.super }}
|
{% block extrahead %}{{ block.super }}
|
||||||
<script type="text/javascript" src="../../../jsi18n/"></script>
|
<script type="text/javascript" src="../../../jsi18n/"></script>
|
||||||
{% for js in javascript_imports %}{% include_admin_script js %}{% endfor %}
|
{% for js in javascript_imports %}<script type="text/javascript" src="{{ js }}"></script>
|
||||||
|
{% endfor %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block stylesheet %}{% admin_media_prefix %}css/forms.css{% endblock %}
|
{% block stylesheet %}{% admin_media_prefix %}css/forms.css{% endblock %}
|
||||||
|
@ -15,23 +15,6 @@ word_re = re.compile('[A-Z][a-z]+')
|
|||||||
def class_name_to_underscored(name):
|
def class_name_to_underscored(name):
|
||||||
return '_'.join([s.lower() for s in word_re.findall(name)[:-1]])
|
return '_'.join([s.lower() for s in word_re.findall(name)[:-1]])
|
||||||
|
|
||||||
def include_admin_script(script_path):
|
|
||||||
"""
|
|
||||||
Returns an HTML script element for including a script from the admin
|
|
||||||
media url.
|
|
||||||
|
|
||||||
Example usage::
|
|
||||||
|
|
||||||
{% include_admin_script js/calendar.js %}
|
|
||||||
|
|
||||||
could return::
|
|
||||||
|
|
||||||
<script type="text/javascript" src="/media/admin/js/calendar.js">
|
|
||||||
"""
|
|
||||||
|
|
||||||
return '<script type="text/javascript" src="%s%s"></script>' % (settings.ADMIN_MEDIA_PREFIX, script_path)
|
|
||||||
include_admin_script = register.simple_tag(include_admin_script)
|
|
||||||
|
|
||||||
def submit_row(context):
|
def submit_row(context):
|
||||||
opts = context['opts']
|
opts = context['opts']
|
||||||
change = context['change']
|
change = context['change']
|
||||||
|
@ -48,33 +48,6 @@ def quote(s):
|
|||||||
res[i] = '_%02X' % ord(c)
|
res[i] = '_%02X' % ord(c)
|
||||||
return ''.join(res)
|
return ''.join(res)
|
||||||
|
|
||||||
def get_javascript_imports(opts, auto_populated_fields, field_sets):
|
|
||||||
# Put in any necessary JavaScript imports.
|
|
||||||
js = ['js/core.js', 'js/admin/RelatedObjectLookups.js']
|
|
||||||
if auto_populated_fields:
|
|
||||||
js.append('js/urlify.js')
|
|
||||||
if opts.has_field_type(models.DateTimeField) or opts.has_field_type(models.TimeField) or opts.has_field_type(models.DateField):
|
|
||||||
js.extend(['js/calendar.js', 'js/admin/DateTimeShortcuts.js'])
|
|
||||||
if opts.get_ordered_objects():
|
|
||||||
js.extend(['js/getElementsBySelector.js', 'js/dom-drag.js' , 'js/admin/ordering.js'])
|
|
||||||
if opts.admin.js:
|
|
||||||
js.extend(opts.admin.js)
|
|
||||||
seen_collapse = False
|
|
||||||
for field_set in field_sets:
|
|
||||||
if not seen_collapse and 'collapse' in field_set.classes:
|
|
||||||
seen_collapse = True
|
|
||||||
js.append('js/admin/CollapsedFieldsets.js')
|
|
||||||
|
|
||||||
for field_line in field_set:
|
|
||||||
try:
|
|
||||||
for f in field_line:
|
|
||||||
if f.rel and isinstance(f, models.ManyToManyField) and f.rel.filter_interface:
|
|
||||||
js.extend(['js/SelectBox.js' , 'js/SelectFilter2.js'])
|
|
||||||
raise StopIteration
|
|
||||||
except StopIteration:
|
|
||||||
break
|
|
||||||
return js
|
|
||||||
|
|
||||||
def model_admin_view(request, app_label, model_name, rest_of_url):
|
def model_admin_view(request, app_label, model_name, rest_of_url):
|
||||||
model = models.get_model(app_label, model_name)
|
model = models.get_model(app_label, model_name)
|
||||||
if model is None:
|
if model is None:
|
||||||
@ -142,7 +115,6 @@ def render_change_form(model_admin, model, manipulator, context, add=False, chan
|
|||||||
opts = model._meta
|
opts = model._meta
|
||||||
app_label = opts.app_label
|
app_label = opts.app_label
|
||||||
auto_populated_fields = [f for f in opts.fields if f.prepopulate_from]
|
auto_populated_fields = [f for f in opts.fields if f.prepopulate_from]
|
||||||
field_sets = model_admin.get_field_sets()
|
|
||||||
original = getattr(manipulator, 'original_object', None)
|
original = getattr(manipulator, 'original_object', None)
|
||||||
ordered_objects = opts.get_ordered_objects()
|
ordered_objects = opts.get_ordered_objects()
|
||||||
inline_related_objects = opts.get_followed_related_objects(manipulator.follow)
|
inline_related_objects = opts.get_followed_related_objects(manipulator.follow)
|
||||||
@ -154,7 +126,6 @@ def render_change_form(model_admin, model, manipulator, context, add=False, chan
|
|||||||
'has_file_field': opts.has_field_type(models.FileField),
|
'has_file_field': opts.has_field_type(models.FileField),
|
||||||
'has_absolute_url': hasattr(model, 'get_absolute_url'),
|
'has_absolute_url': hasattr(model, 'get_absolute_url'),
|
||||||
'auto_populated_fields': auto_populated_fields,
|
'auto_populated_fields': auto_populated_fields,
|
||||||
'javascript_imports': get_javascript_imports(opts, auto_populated_fields, field_sets),
|
|
||||||
'ordered_objects': ordered_objects,
|
'ordered_objects': ordered_objects,
|
||||||
'inline_related_objects': inline_related_objects,
|
'inline_related_objects': inline_related_objects,
|
||||||
'form_url': form_url,
|
'form_url': form_url,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user