Skip to content

Commit

Permalink
Fixed #957 -- prepopulated_fields now works correctly on inlines.
Browse files Browse the repository at this point in the history
git-svn-id: http://code.djangoproject.com/svn/django/trunk@8385 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
brosner committed Aug 15, 2008
1 parent f586c0b commit d7467a0
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 15 deletions.
10 changes: 9 additions & 1 deletion django/contrib/admin/options.py
Expand Up @@ -822,6 +822,14 @@ def __init__(self, parent_model, admin_site):
self.verbose_name = self.model._meta.verbose_name
if self.verbose_name_plural is None:
self.verbose_name_plural = self.model._meta.verbose_name_plural

def _media(self):
from django.conf import settings
js = []
if self.prepopulated_fields:
js.append('js/urlify.js')
return forms.Media(js=['%s%s' % (settings.ADMIN_MEDIA_PREFIX, url) for url in js])
media = property(_media)

def get_formset(self, request, obj=None):
"""Returns a BaseInlineFormSet class for use in admin add/change views."""
Expand Down Expand Up @@ -866,7 +874,7 @@ def fields(self):
yield self.formset.form.base_fields[field_name]

def _media(self):
media = self.formset.media
media = self.opts.media + self.formset.media
for fs in self:
media = media + fs.media
return media
Expand Down
15 changes: 1 addition & 14 deletions django/contrib/admin/templates/admin/change_form.html
Expand Up @@ -58,20 +58,7 @@
{% endif %}

{# JavaScript for prepopulated fields #}

{% if add %}
<script type="text/javascript">
{% for field in adminform.prepopulated_fields %}
document.getElementById("{{ field.field.auto_id }}").onchange = function() { this._changed = true; };
{% for dependency in field.dependencies %}
document.getElementById("{{ dependency.auto_id }}").onkeyup = function() {
var e = document.getElementById("{{ field.field.auto_id }}");
if (!e._changed) { e.value = URLify({% for innerdep in field.dependencies %}document.getElementById("{{ innerdep.auto_id }}").value{% if not forloop.last %} + ' ' + {% endif %}{% endfor %}, {{ field.field.field.max_length }}); }
}
{% endfor %}
{% endfor %}
</script>
{% endif %}
{% prepopulated_fields_js %}

</div>
</form></div>
Expand Down
11 changes: 11 additions & 0 deletions django/contrib/admin/templates/admin/prepopulated_fields_js.html
@@ -0,0 +1,11 @@
<script type="text/javascript">
{% for field in prepopulated_fields %}
document.getElementById("{{ field.field.auto_id }}").onchange = function() { this._changed = true; };
{% for dependency in field.dependencies %}
document.getElementById("{{ dependency.auto_id }}").onkeyup = function() {
var e = document.getElementById("{{ field.field.auto_id }}");
if (!e._changed) { e.value = URLify({% for innerdep in field.dependencies %}document.getElementById("{{ innerdep.auto_id }}").value{% if not forloop.last %} + ' ' + {% endif %}{% endfor %}, {{ field.field.field.max_length }}); }
}
{% endfor %}
{% endfor %}
</script>
16 changes: 16 additions & 0 deletions django/contrib/admin/templatetags/admin_modify.py
Expand Up @@ -2,6 +2,22 @@

register = template.Library()

def prepopulated_fields_js(context):
"""
Creates a list of prepopulated_fields that should render Javascript for
the prepopulated fields for both the admin form and inlines.
"""
prepopulated_fields = []
if context["add"]:
prepopulated_fields.extend(context["adminform"].prepopulated_fields)
for inline_admin_formset in context['inline_admin_formsets']:
for inline_admin_form in inline_admin_formset:
if inline_admin_form.original is None:
prepopulated_fields.extend(inline_admin_form.prepopulated_fields)
context.update({"prepopulated_fields": prepopulated_fields})
return context
prepopulated_fields_js = register.inclusion_tag('admin/prepopulated_fields_js.html', takes_context=True)(prepopulated_fields_js)

def submit_row(context):
opts = context['opts']
change = context['change']
Expand Down

0 comments on commit d7467a0

Please sign in to comment.