# parler.admin module

Translation support for admin forms.

django-parler provides the following classes:

- Model support: `TranslatableAdmin`.

- Inline support: `TranslatableInlineModelAdmin`, `TranslatableStackedInline`, `TranslatableTabularInline`.

- Utilities: `SortedRelatedFieldListFilter`.

Admin classes can be created as expected:

    from django.contrib import admin
    from parler.admin import TranslatableAdmin
    from myapp.models import Project

    class ProjectAdmin(TranslatableAdmin):
        list_display = ('title', 'status')
        fieldsets = (
            (None, {
                'fields': ('title', 'status'),
            }),
        )

    admin.site.register(Project, ProjectAdmin)

All translated fields can be used in the `list_display` and `fieldsets` like normal fields.

While almost every admin feature just works, there are a few special cases to take care of:

- The `search_fields` needs the actual ORM fields.

- The `prepopulated_fields` needs to be replaced with a call to `get_prepopulated_fields()`.

See the admin compatibility page for details.

## The `BaseTranslatableAdmin` class

class parler.admin.BaseTranslatableAdmin

  The shared code between the regular model admin and inline classes.

  form

    alias of `parler.forms.TranslatableModelForm`

  get_form_language(request, obj=None)

    Return the current language for the currently displayed object fields.

  get_language_tabs(request, obj, available_languages, css_class=None)

    Determine the language tabs to show.

  get_queryset(request)

    Make sure the current language is selected.

  get_queryset_language(request)

    Return the language to use in the queryset.

  query_language_key = 'language'

    The URL parameter for the language value.

## The `TranslatableAdmin` class

class parler.admin.TranslatableAdmin(model, admin_site)

  Base class for translated admins.

  This class also works as regular admin for non TranslatableModel objects. When using this class with a non-TranslatableModel, all operations effectively become a NO-OP.

  all_languages_column(object)

    The language column which can be included in the `list_display`. It also shows untranslated languages

  property change_form_template

    Dynamic property to support transition to regular models.

    This automatically picks `admin/parler/change_form.html` when the admin uses a translatable model.

  default_change_form_template

    Determine what the actual change_form_template should be.

  delete_inline_translations = True

    Whether translations of inlines should also be deleted when deleting a translation.

  delete_model_translation(request, translation)

    Hook for deleting a translation. This calls `get_translation_objects()` to collect all related objects for the translation. By default, that includes the translations for inline objects.

  delete_translation(request, object_id, language_code)

    The ‘delete translation’ admin view for this model.

  deletion_not_allowed(request, obj, language_code)

    Deletion-not-allowed view.

  get_available_languages(obj)

    Fetching the available languages as queryset.

  get_form(request, obj=None, **kwargs)

    Pass the current language to the form.

  get_language_short_title(language_code)

    Hook for allowing to change the title in the `language_column()` of the list_display.

  get_object(request, object_id, *args, **kwargs)

    Make sure the object is fetched in the correct language.

  get_queryset(request)

    Make sure the current language is selected.

  get_translation_objects(request, language_code, obj=None, inlines=True)

    Return all objects that should be deleted when a translation is deleted. This method can yield all QuerySet objects or lists for the objects.

  get_urls()

    Add a delete-translation view.

  language_column(object)

    The language column which can be included in the `list_display`.

  prefetch_language_column = True

    Whether the translations should be prefetched when displaying the ‘language_column’ in the list.

  render_change_form(request, context, add=False, change=False, form_url='', obj=None)

    Insert the language tabs.

  response_add(request, obj, post_url_continue=None)

    Determine the HttpResponse for the add_view stage.

  response_change(request, obj)

    Determine the HttpResponse for the change_view stage.

## The `TranslatableInlineModelAdmin` class

class parler.admin.TranslatableInlineModelAdmin(parent_model, admin_site)

  Base class for inline models.

  form

    alias of `parler.forms.TranslatableModelForm`

  formset

    alias of `parler.forms.TranslatableBaseInlineFormSet`

  get_available_languages(obj, formset)

    Fetching the available inline languages as queryset.

  get_form_language(request, obj=None)

    Return the current language for the currently displayed object fields.

  get_formset(request, obj=None, **kwargs)

    Return the formset, and provide the language information to the formset.

  get_queryset_language(request)

    Return the language to use in the queryset.

  property inline_tabs

    Whether to show inline tabs, can be set as attribute on the inline.

## The `TranslatableStackedInline` class

class parler.admin.TranslatableStackedInline(parent_model, admin_site)

  The inline class for stacked layout.

## The `TranslatableTabularInline` class

class parler.admin.TranslatableTabularInline(parent_model, admin_site)

  The inline class for tabular layout.

## The `SortedRelatedFieldListFilter` class

class parler.admin.SortedRelatedFieldListFilter(*args, **kwargs)

  Override the standard `RelatedFieldListFilter`, to sort the values after rendering their `__unicode__()` values. This can be used for translated models, which are difficult to sort beforehand. Usage:

      from django.contrib import admin
      from parler.admin import SortedRelatedFieldListFilter

      class MyAdmin(admin.ModelAdmin):

          list_filter = (
              ('related_field_name', SortedRelatedFieldListFilter),
          )