Version 3 (modified by 18 years ago) ( diff ) | ,
---|
AjaxForeignKey Field
The Problem
In the Admin, I would like to have an autocompletion field for ForeignKey references. I know raw-id-admin works, but AJAX is just so much cooler.
The Solution
Overview
Using YUI, create a new field similar to models.ForeignKey
that renders differently in the admin.
Installation
Here's how it's setup:
- Create a new folder in your project called
ajaxfkey
- Put four files in that directory:
__init__.py
-- duhfields.py
-- contains the actual model field. (download)forms.py
-- contains the form field. (download)views.py
-- contains the AJAX view. (download)
- Create a
base_site.html
file in yourbase_templates/admin
directory.
- Modify your
urls conf
to contain the ajax view.
- Modify your models to use it correctly.
Creating base_templates/admin/base_site.html
Put the contents below in the file, but be wary of where yui is on your setup.
{% extends "admin/base.html" %} {% load i18n %} {% block extrahead %}{{ block.super }} <script type="text/javascript" src="/media/scripts/yui/yahoo/yahoo-min.js"></script> <script type="text/javascript" src="/media/scripts/yui/yahoo-dom-event/yahoo-dom-event.js"></script> <script type="text/javascript" src="/media/scripts/yui/dom/dom-min.js"></script> <script type="text/javascript" src="/media/scripts/yui/connection/connection-min.js"></script> <script type="text/javascript" src="/media/scripts/yui/animation/animation-min.js"></script> <script type="text/javascript" src="/media/scripts/yui/autocomplete/autocomplete-min.js"></script> <script type="text/javascript" src="/media/scripts/json.js"></script> {% endblock %} {% block title %}{{ title|escape }} | {% trans 'Django site admin' %}{% endblock %} {% block branding %} <h1 id="site-name">{% trans 'Django administration' %}</h1> {% endblock %} {% block nav-global %}{% endblock %}
Notice how YUI is in "/media/scripts/yui"
and I downloaded json.js.
Modify urls.py
Put the following in your urls configuration:
(r'^admin/ajax_autocomplete/?', 'project.ajaxfkey.views.ajax_autocomplete'),
Change project.ajaxfkey
to the path to the views file you created.
Using it in your models
Below is an example usage in some models:
from django.db import models from ajaxfkey.fields import AjaxForeignKey # notice the manager, we can create a staticmethod in Poll if we wanted. class PollManager(models.Manager): def ajax_autocomplete(self, data): return self.filter(question__istartswith = data).order_by('question') class Poll(models.Model): question = models.CharField(maxlength=200) pub_date = models.DateTimeField('date published') class Choice(models.Model): # notice it's the same syntax as models.ForeignKey poll = AjaxForeignKey(Poll) choice = models.CharField(maxlength=200) votes = models.IntegerField()
Screenshot
Congratulations, you should be done! The obligatory screenshot is:
Attachments (4)
-
fields.py
(414 bytes
) - added by 18 years ago.
field definition
-
forms.py
(5.0 KB
) - added by 18 years ago.
form field definition
-
views.py
(2.1 KB
) - added by 18 years ago.
Ajax View
-
forms2.py
(6.0 KB
) - added by 18 years ago.
Makes more usable without JS, supports MSIE 6 and 5.5
Download all attachments as: .zip