# parler.views module

The views provide high-level utilities to integrate translation support into other projects.

The following mixins are available:

- `ViewUrlMixin` - provide a `get_view_url` for the {% get_translated_url %} template tag.

- `TranslatableSlugMixin` - enrich the `DetailView` to support translatable slugs.

- `LanguageChoiceMixin` - add `?language=xx` support to a view (e.g. for editing).

- `TranslatableModelFormMixin` - add support for translatable forms, e.g. for creating/updating objects.

The following views are available:

- `TranslatableCreateView` - The `CreateView` with `TranslatableModelFormMixin` support.

- `TranslatableUpdateView` - The `UpdateView` with `TranslatableModelFormMixin` support.

## The `ViewUrlMixin` class

class parler.views.ViewUrlMixin

  Provide a `view.get_view_url` method in the template.

  This tells the template what the exact canonical URL should be of a view. The {% get_translated_url %} template tag uses this to find the proper translated URL of the current page.

  Typically, setting the `view_url_name` just works:

      class ArticleListView(ViewUrlMixin, ListView):
          view_url_name = 'article:list'

  The `get_view_url()` will use the `view_url_name` together with `view.args` and `view.kwargs` construct the URL. When some arguments are translated (e.g. a slug), the `get_view_url()` can be overwritten to generate the proper URL:

      from parler.views import ViewUrlMixin, TranslatableUpdateView
      from parler.utils.context import switch_language

      class ArticleEditView(ViewUrlMixin, TranslatableUpdateView):
          view_url_name = 'article:edit'

          def get_view_url(self):
              with switch_language(self.object, get_language()):
                  return reverse(self.view_url_name, kwargs={'slug': self.object.slug})

  get_view_url()

    This method is used by the `get_translated_url` template tag.

    By default, it uses the `view_url_name` to generate an URL. When the URL `args` and `kwargs` are translatable, override this function instead to generate the proper URL.

  view_url_name = None

    The default view name used by `get_view_url()`, which should correspond with the view name in the URLConf.

## The `TranslatableSlugMixin` class

class parler.views.TranslatableSlugMixin

  An enhancement for the `DetailView` to deal with translated slugs. This view makes sure that:

  - The object is fetched in the proper translation.

  - The slug field is read from the translation model, instead of the shared model.

  - Fallback languages are handled.

  - Objects are not accidentally displayed in their fallback slug, but redirect to the translated slug.

  Example:

      class ArticleDetailView(TranslatableSlugMixin, DetailView):
          model = Article
          template_name = 'article/details.html'

  get_language()

    Define the language of the current view, defaults to the active language.

  get_language_choices()

    Define the language choices for the view, defaults to the defined settings.

  get_object(queryset=None)

    Fetch the object using a translated slug.

  get_translated_filters(slug)

    Allow passing other filters for translated fields.

## The `LanguageChoiceMixin` class

class parler.views.LanguageChoiceMixin

  Mixin to add language selection support to class based views, particularly create and update views. It adds support for the `?language=..` parameter in the query string, and tabs in the context.

  get_current_language()

    Return the current language for the currently displayed object fields. This reads `self.object.get_current_language()` and falls back to `get_language()`.

  get_default_language(object=None)

    Return the default language to use, if no language parameter is given. By default, it uses the default parler-language.

  get_language()

    Get the language parameter from the current request.

  get_language_tabs()

    Determine the language tabs to show.

  get_object(queryset=None)

    Assign the language for the retrieved object.

## The `TranslatableModelFormMixin` class

class parler.views.TranslatableModelFormMixin

  Mixin to add translation support to class based views.

  For example, adding translation support to django-oscar:

      from oscar.apps.dashboard.catalogue import views as oscar_views
      from parler.views import TranslatableModelFormMixin

      class ProductCreateUpdateView(TranslatableModelFormMixin, oscar_views.ProductCreateUpdateView):
          pass

  get_form_class()

    Return a `TranslatableModelForm` by default if no form_class is set.

  get_form_kwargs()

    Pass the current language to the form.

## The `TranslatableCreateView` class

class parler.views.TranslatableCreateView(**kwargs)

  Create view that supports translated models. This is a mix of the `TranslatableModelFormMixin` and Django’s `CreateView`.

## The `TranslatableUpdateView` class

class parler.views.TranslatableUpdateView(**kwargs)

  Update view that supports translated models. This is a mix of the `TranslatableModelFormMixin` and Django’s `UpdateView`.