GitHub - AndrewIngram/django-extra-views: Django's class-based generic views are awesome, let's have more of them. (original) (raw)

Build Status Coverage Status Documentation Status

Django Extra Views - The missing class-based generic views for Django

Django-extra-views is a Django package which introduces additional class-based views in order to simplify common design patterns such as those found in the Django admin interface.

Supported Python and Django versions: Python 3.6+, Django 2.2-5.1, see tox.ini for an up-to-date list.

Full documentation is available at read the docs.

Installation

Install the stable release from pypi (using pip):

pip install django-extra-views

Or install the current master branch from github:

pip install -e git://github.com/AndrewIngram/django-extra-views.git#egg=django-extra-views

Then add 'extra_views' to your INSTALLED_APPS:

INSTALLED_APPS = [ ... 'extra_views', ... ]

Features

Still to do

Add support for pagination in ModelFormSetView and its derivatives, the goal being to be able to mimic the change_list view in Django's admin. Currently this is proving difficult because of how Django's MultipleObjectMixin handles pagination.

Quick Examples

FormSetView

Define a FormSetView, a view which creates a single formset fromdjango.forms.formset_factory and adds it to the context.

from extra_views import FormSetView from my_forms import AddressForm

class AddressFormSet(FormSetView): form_class = AddressForm template_name = 'address_formset.html'

Then within address_formset.html, render the formset like this:

... {{ formset }} ...

ModelFormSetView

Define a ModelFormSetView, a view which works as FormSetViewbut instead renders a model formset usingdjango.forms.modelformset_factory.

from extra_views import ModelFormSetView

class ItemFormSetView(ModelFormSetView): model = Item fields = ['name', 'sku'] template_name = 'item_formset.html'

CreateWithInlinesView or UpdateWithInlinesView

Define CreateWithInlinesView and UpdateWithInlinesView, views which render a form to create/update a model instance and its related inline formsets. Each of the InlineFormSetFactory classes use similar class definitions as the ModelFormSetView.

from extra_views import CreateWithInlinesView, UpdateWithInlinesView, InlineFormSetFactory

class ItemInline(InlineFormSetFactory): model = Item fields = ['sku', 'price', 'name']

class ContactInline(InlineFormSetFactory): model = Contact fields = ['name', 'email']

class CreateOrderView(CreateWithInlinesView): model = Order inlines = [ItemInline, ContactInline] fields = ['customer', 'name'] template_name = 'order_and_items.html'

class UpdateOrderView(UpdateWithInlinesView): model = Order inlines = [ItemInline, ContactInline] fields = ['customer', 'name'] template_name = 'order_and_items.html'

Then within order_and_items.html, render the formset like this:

... {{ form }}

{% for formset in inlines %} {{ formset }} {% endfor %} ...

Contributing

Pull requests are welcome. To run all tests locally, setup a virtual environment and run

Before committing, use pre-commit to check all formatting and linting

pip install pre-commit pre-commmit install

This will automatically run black, isort and flake8 before the commit is accepted.