Skip to main content
WARNING: PyPI Phishing attack ongoing. Please check that you are on the correct domain - PyPI dot org - before continuing  PyPI

raw_id_fields widget replacement that handles display of an object's string value on change.

Project description

https://img.shields.io/pypi/v/django-dynamic-raw-id.svg https://travis-ci.org/lincolnloop/django-dynamic-raw-id.svg?branch=master https://api.codacy.com/project/badge/Coverage/bb93482e6a6348058b993a42951a9f19 https://api.codacy.com/project/badge/Grade/bb93482e6a6348058b993a42951a9f19

django-dynamic-raw-id

A Django admin raw_id_fields widget replacement that handles display of an object’s string value on change and can be overridden via a template. See this example:

http://d.pr/i/10GtM.png

Installation

The app is compatible and tested with Python 2.7 → 3.7 and all versions of Django between 1.8 → 2.1.

Install the package with pip:

$ pip install django-dynamic-raw-id

Put dynamic_raw_id to your list of INSTALLED_APPS:

INSTALLED_APPS = (
    # ... other apps
    'dynamic_raw_id',
)

And add the urlpattern:

urlpatterns = [
    # ...
    url(r'^admin/dynamic_raw_id/', include('dynamic_raw_id.urls')),
]

dynamic_raw_id comes with some static files so don’t forget to run manage.py collectstatic.

Usage

To start using django-dynamic-raw-id in your application all you need to do is implement DynamicRawIDMixin in your ModelAdmin class and add the desired fields to a list of dynamic_raw_id_fields:

from dynamic_raw_id.admin import DynamicRawIDMixin

class UserProfileAdmin(DynamicRawIDMixin, admin.ModelAdmin):
    dynamic_raw_id_fields = ('user',)

You can use dynamic_raw_id widgets in a Admin filter as well:

from dynamic_raw_id.admin import DynamicRawIDMixin
from dynamic_raw_id.filters import DynamicRawIDFilter

class UserProfileAdmin(DynamicRawIDMixin, admin.ModelAdmin):
   list_filter = (
       ('dynamic_raw_id_fk', DynamicRawIDFilter),
   )

Customizing the value of the dynamic widget

The coolest feature of django-dynamic-raw-id is the ability to customize the output of the value displayed alongside the DynamicRawIDWidget. There is a basic implementation if all you want is your object’s __unicode__ value. To change the value displayed all you need to do is implement the correct template.

django-dynamic-raw-id looks for this template structure dynamic_raw_id/<app>/<model>.html and dynamic_raw_id/<app>/multi_<model>.html (for multi-value lookups).

For instance, if I have a blog post with a User dynamic_raw_id field that I want display as Firstname Lastname, I would create the template dynamic_raw_id/auth/user.html with:

<span>{{ object.0.first_name }} {{ object.0.last_name }}</span>

A custom admin URL prefix

If you have your admin and the dynamic_raw_id scripts located on a different prefix than /admin/dynamic_raw_id/ you need adjust the DYNAMIC_RAW_ID_MOUNT_URL JS variable.

Example:

# In case the app is setup at /foobar/dynamic_raw_id/
url(r'^foobar/dynamic_raw_id/', include('dynamic_raw_id.urls')),

# Provide a
<script>
    window.DYNAMIC_RAW_ID_MOUNT_URL = "{% url "admin:index" %}";
</script>

An ideal place is the admin base_site.html template. Full example:

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

{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}

{% block extrahead %}
  {{ block.super }}
  <script>
    window.DYNAMIC_RAW_ID_MOUNT_URL = "{% url "admin:index" %}";
  </script>
{% endblock %}

{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>
{% endblock %}

{% block nav-global %}{% endblock %}

Testing and Local Development

The testsuite uses Selenium to do frontend tests, we require Firefox and geckodriver to be installed. You can install geckodriver on OS X with Homebrew:

$ brew install geckodriver

Run the testsuite in your local environment using:

$ cd django-dynamic-raw-id/
$ pipenv install --dev
$ pipenv run test

Or use tox to test against various Django and Python versions:

$ tox -r

You can also invoke the test suite or other ‘manage.py’ commands by calling the django-admin tool with the test app settings:

$ cd django-dynamic-raw-id/
$ pipenv install --dev
$ pipenv run django-admin
$ pipenv run django-admin test

This also allows you to run the internal testing app in a testserver, to preview a sample of what django-dynamic-raw-id is doing:

$ pipenv run django-admin migrate
$ pipenv run django-admin createsuperuser
$ pipenv run django-admin runserver
DJANGO_SETTINGS_MODULE=dynamic_raw_id.tests.testapp.settings

Changelog

v2.7 (2020-05-02)

  • Django 3.0 compatibility and tests.

v2.6 (2019-06-21)

  • BACKWARDS INCOMPATIBLE: Dropped support for Django <1.11.

  • BACKWARDS INCOMPATIBLE: Dropped support for Python 3.4.

  • Django 2.2 compatibility and tests.

  • General code cleanup.

  • Pipenv support for local development.

  • Some visual fixes around icons and alignment.

v2.5 (2018-12-09)

  • Django 2.1 compatibility and tests.

v2.4 (2018-04-09)

  • Fixes missing icons in Admin views.

  • Fixes missing JS handling when using a custom /admin/ url.

v2.3 (2018-01-18)

  • BACKWARDS INCOMPATIBLE: Renamed the project to django-dynamic-raw-id. to reflect what it’s actually doing.

  • Fixed glass lookup icon in Django 1.10 and below.

  • Specific ordering of media asset loading.

v1.2 (2018-01-17)

  • Multiple fixes and enhancements.

  • Full Selenium based testsuite.

  • Django 2.0 and Python 3 compatibility.

  • pipenv support.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page