Login

admin: edit related object shortcut

Author:
christian
Posted:
October 1, 2007
Language:
JavaScript
Version:
Not specified
Score:
5 (after 5 ratings)

Adds a shortcut to edit releated objects right/ForeignKey fields. an edit symbol will be shown right next to the "add annother" link on all select boxes, with opens the releated object currently selected in a popup window. depends on jquery

Add this to the head of "templates/admin/base.html". you may need to add <script type="text/javascript" src="/path/to/jquery.js"></script> before it

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<script type="text/javascript">
    $(function(){
        $("select+a.add-another").each(function(){
            $(this).after("&nbsp;<a class='changelink' href='#'></a>");
            $(this).next().click(function(){
                var link = ($(this).prev().attr('href')+'../'+$(this).prev().prev().attr('value'));
                var win = window.open(link + '?_popup=1', link, 'height=600,width=1000,resizable=yes,scrollbars=yes');
                win.focus();
                return false;
            });
        });
    });
</script>

More like this

  1. Django Collapsed Stacked Inlines by applecat 1 year, 1 month ago
  2. Django Collapsed Stacked Inlines by mkarajohn 3 years, 2 months ago
  3. Dynamically adding forms to a formset. OOP version. by halfnibble 8 years, 10 months ago
  4. Convert multiple select for m2m to multiple checkboxes in django admin form by abidibo 10 years, 11 months ago
  5. Django admin inline ordering - javascript only implementation by ojhilt 11 years, 3 months ago

Comments

magicrebirth (on April 21, 2009):

Thanks! That's exactly what I was looking for...

I modified it a little so that if nothing's selected in the FK field it just opens the generic 'select object to change' popup (instead of throwing an error).

` $(function(){

    $("select+a.add-another").each(function(){
        $(this).after("&nbsp;<a class='changelink' href='#'></a>");
        $(this).next().click(function(){

            var linkvalue = $(this).prev().prev().attr('value');
            if (linkvalue) {
                var linkname = ($(this).prev().attr('href')+'../'+linkvalue);   
                var link = linkname + '?_popup=1';
            }  else  {
                var linkname = ($(this).prev().attr('href').replace("add/", ""));
                var link = linkname + "?t=id&pop=1";
            }

            var win = window.open(linkname, link, 'height=600,width=1000,resizable=yes,scrollbars=yes');
            win.focus();
            return false;

        });
    });

`

#

marcob (on August 14, 2009):

With this two lines patch, Save button close the window.

diff -r 5d02762d8f3b django/contrib/admin/options.py
--- django/contrib/admin/options.py Thu Aug 13 12:54:32 2009 +0200
+++ django/contrib/admin/options.py Fri Aug 14 13:45:36 2009 +0200
@@ -632,6 +632,9 @@
         pk_value = obj._get_pk_val()

         msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj)}
+
+        if request.POST.has_key("_popup"):
+            return HttpResponse('<script type="text/javascript">window.close();</script>')
         if request.POST.has_key("_continue"):
             self.message_user(request, msg + ' ' + _("You may edit it again below."))
             if request.REQUEST.has_key('_popup'):

#

nemesis (on January 28, 2010):

Two little changes: added a title attribute to the edit icon and a simple if that prevents opening a new window in case nothing is selected:

$(function(){
    $("select+a.add-another").each(function(){
        $(this).after("&nbsp;<a class='changelink' href='#' title='Edit slected item'></a>");
        $(this).next().click(function(){
            if($(this).prev().prev().attr('value')=='') return false;
            var link = ($(this).prev().attr('href')+'../'+$(this).prev().prev().attr('value'));
            var win = window.open(link + '?_popup=1', link, 'height=600,width=1000,resizable=yes,scrollbars=yes');
            win.focus();
            return false;
        });
    });
});

#

lee (on September 27, 2011):

Probably a noob problem, but the snippet has no effect for me with Django 1.3. The script shows up in the head section, and I've added the jquery line, but no markup is added after the add-another links. Any ideas?

#

lee (on September 27, 2011):

Scratch my comment, I had the wrong path to my jquery.js. Snippet works great under 1.3.

#

sleytr (on March 2, 2012):

Modified for rawid fields. Converted $s to django.jQuery for placing it into change_form.html. Works with Django 1.4b1.

    django.jQuery(window).ready(function () {
        django.jQuery('.vForeignKeyRawIdAdminField').each(function(){
            var fkf =django.jQuery(this)
            if(fkf.val()){
                var editlink = fkf.next()
                var name = editlink.next()
                var hrf = editlink.attr('href').split('?')[0] + fkf.val()
                name.after("&nbsp;<a class='changelink' href='"+hrf+"'></a>");
            }
        })
        django.jQuery("select+a.add-another").each(function(){
            django.jQuery(this).after("&nbsp;<a class='changelink' href='#'></a>");
            django.jQuery(this).next().click(function(){

                var linkvalue = django.jQuery(this).prev().prev().attr('value');
                if (linkvalue) {
                    var linkname = (django.jQuery(this).prev().attr('href')+'../'+linkvalue);
                    var link = linkname + '?_popup=1';
                }  else  {
                    var linkname = (django.jQuery(this).prev().attr('href').replace("add/", ""));
                    var link = linkname + "?t=id&pop=1";
                }

                var win = window.open(linkname, link, 'height=600,width=1000,resizable=yes,scrollbars=yes');
                win.focus();
                return false;

            });
        });})

#

darklow (on February 5, 2013):

Another workaround, if want to close popup window after save and you don't want to patch django/contrib/admin/options/.py

Extend original admin/change_list.html in following way.

{% extends "admin/change_list.html" %}

{% block js_foot %}
    {{ block.super }}
    <script type="text/javascript">
    if(document.referrer.indexOf('_popup') != -1) {
        self.close()
    }
    </script>
{% endblock %}

#

Please login first before commenting.