39

I'm gonna slightly simplify the situation. Let's say I've got a model called Lab.

from django.db import models

class Lab(models.Model):
    acronym = models.CharField(max_length=20)
    query = models.TextField()

The field query is nearly always the same as the field acronym. Thus, I'd like the query field to be automatically filled in after entering text in the acronym field in the Django admin interface. This task must be performed by a jQuery script.

So if I take an example: you want to add a new lab to the database through the Django admin interface. You click the add button and you land on the empty form with the two fields. You manually fill in the acronym field with a value such as ABCD and then the query field should antomatically be completed with the same value, that means ABCD.

How should I proceed?

2 Answers 2

84

To add media to the admin you can simply add it to the meta class Media of your admin class, e.g.:

admin.py

class FooAdmin(admin.ModelAdmin):
    # regular stuff
    class Media:
        js = (
            '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js', # jquery
            'js/myscript.js',       # project static folder
            'app/js/myscript.js',   # app static folder
        )

admin.site.register(Foo, FooAdmin)

Mind the trailing comma if you only have one file included, as it has to be a tuple. You can also opt in css this way.

The admin already has (an older version) of jquery included. To shortcut it for usage add this to the top of the 'myscript' file:

if (!$) {
    $ = django.jQuery;
}

To solve your problem, I would extend the admin. You can add a js event to any DOM node to trigger an ajax call in your myscript file to the correct admin view for handling.

Sign up to request clarification or add additional context in comments.

3 Comments

This may have changed since it's an old question, but as of Django 1.8.1, the css is specified as a dictionary with the key being the target media and the value being the tuple of paths as above. Use comma separation to target multiple medias or 'all' if it's non-specific.
(function($){ // your code })(django.jQuery);
Better and shorter django.jQuery(function($) { // stuff })
0

Be careful also because sometimes even django.jQuery can yet not loaded and you will get an error, you can wait until DOM loaded using vanilla js, and then do what the other replies suggested, this way:

document.addEventListener('DOMContentLoaded', function () {
  django.jQuery(function($) {
    // stuff using jQuery directly for example: $("selector")
  });
});

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.