Django's class-based generic views are awesome, let's have more of them.

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.

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

  • FormSet and ModelFormSet views - The formset equivalents of FormView and ModelFormView.
  • InlineFormSetView - Lets you edit a formset related to a model (using Django's inlineformset_factory).
  • CreateWithInlinesView and UpdateWithInlinesView - Lets you edit a model and multiple inline formsets all in one view.
  • GenericInlineFormSetView, the equivalent of InlineFormSetView but for GenericForeignKeys.
  • Support for generic inlines in CreateWithInlinesView and UpdateWithInlinesView.
  • Support for naming each inline or formset in the template context with NamedFormsetsMixin.
  • SortableListMixin - Generic mixin for sorting functionality in your views.
  • SearchableListMixin - Generic mixin for search functionality in your views.
  • SuccessMessageMixin and FormSetSuccessMessageMixin - Generic mixins to display success messages after form submission.

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 from django.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:

<form method="post">
  ...
  {{ formset }}
  ...
  <input type="submit" value="Submit" />
</form>

ModelFormSetView

Define a ModelFormSetView, a view which works as FormSetView but instead renders a model formset using django.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 method="post">
  ...
  {{ form }}

  {% for formset in inlines %}
    {{ formset }}
  {% endfor %}
  ...
  <input type="submit" value="Submit" />
</form>
Comments
  • Big Documentation Clean Up

    Big Documentation Clean Up

    This is a clean up and expansion of the documentation. It's the first time I've done any restructuring of docs so please let me know if you see any improvements needed. Maybe the formset views section is so large that they should be divided up into more manageable pages.

    I didn't modify the ListView documentation much as I'm not sure what their future is.

  • How do you pass variables as kwargs to formset forms?

    How do you pass variables as kwargs to formset forms?

    If I have a View like this:

    class CreateListingView(NamedFormsetsMixin, CreateWithInlinesView):
        model = MyModel
        form_class = MyModelForm
        inlines = [InlineFormsetInlineDerp1, InlineFormsetInlineDerp2]
        inlines_names = ['derp1', 'derp2']
    

    Is there a function on that view like this:

    def get_formset_kwargs(...):
        kwargs.update({'my_variable': some.variable})
    

    So that in my FORM of the formset I can do this:

    class Derp1Form(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            self.my_variable= kwargs.pop('my_variable', None)
            super().__init__(*args, **kwargs)
            .....
    

    I have been hunting through this documentation and through the source, and haven't been able to do this yet, but this is a pretty common pattern. Almost thinking of going back to my FBV as I am wasting too much time on this library.

  • Find someone to take over ownership of this project

    Find someone to take over ownership of this project

    As is probably clear from the number of open issues and pull requests, I'm not really paying much attention to this project. The reason is a combination of not really working with formsets (or even Django views) much anymore, and a lack of free time outside of work to commit to the project.

    So I'm looking for someone who is interested in taking over ownership of the project. It could be trialled by me adding the person as a contributor, and letting them look at the open issues and pull requests and getting things down to a reasonable number. Ideally this person would already be a moderately active open source contributor, so that we don't end up back in the current situation but under a different owner.

    I expect that once the backlog of issues is cleared, most work will just be related to keeping dependencies updated, and adding compatibility with future Django versions.

    Anybody interested?

  • Changing the model forms used in CreateWithInlinesView

    Changing the model forms used in CreateWithInlinesView

    I want to create a batch of invites. So there is a main form where I can name the batch and then an inline formset to allow the user to add 1+ email addresses. I want to control the forms used in each instance.

    While it seems to make use of my custom main form, it doesn't seem to be working for the inlines. It is just showing all fields for every inline.

    Here is an approximation of my setup:

    models.py

    class Batch(models.Model):
        name = models.CharField(...)
    
        other_field = ...
    
    class Invite(models.Model):
        email = models.EmailField(...)
        batch = models.ForeignKey(Batch)
    
        other_fields = ...
    

    forms.py

    from extra_views import InlineFormSet
    
    class BatchModelForm(forms.ModelForm):
        class Meta:
            model = Batch
            fields = ["name", ]
    
    class InviteModelForm(forms.ModelForm):
        class Meta:
            model = Invite
            fields = ["email", ]
    
    class InviteInlineFormSet(InlineFormSet):
        model = Invite
        form_class = InviteModelForm  # This doesn't seem to work
    

    views.py

    from .forms import InviteInlineFormSet, BatchModelForm
    from .models import Batch
    
    class BatchInviteView(CreateWithInlinesView):
        model = Batch
        form_class = BatchModelForm
        inlines = [InviteInlineFormSet, ]
    
        def get_success_url(self):
            ...
    

    I would expect the form_class attribute of the InviteInlineFormSet to give me control over the inline model form but this doesn't seem to be the case (while form_class = BatchModelForm on the BatchInviteView is correctly giving me control of the main model form class)

  • FieldDoesNotExist at /products/product/add/ ProductImages has no field named 'content_type'

    FieldDoesNotExist at /products/product/add/ ProductImages has no field named 'content_type'

    model 1

    class Products(models.Model):
        product_category = models.ForeignKey(ProductCategory)
        product_sub_category =  models.ForeignKey(ProductCategory)
        product_name = models.CharField(max_length = 200)
       is_active = models.BooleanField(default = True)
       and so on...
    

    model 2

    class ProductImages(models.Model):
        product = models.ForeignKey( Products )
        product_image = models.FileField(_('Attachment'), upload_to='attachments')
        is_active = models.BooleanField(default = True)
    

    GenericInlineFormSet

    class ProductImagesInline(GenericInlineFormSet):
        model = ProductImages
    

    CreateWithInlinesView

    class ProductCreate(CreateWithInlinesView):
        model = Products
        inlines = [ ProductImagesInline ]
        template_name = "products/product_add.html"
        fields = ['product_category', 'product_sub_category', 'product_name', 'size', 'color', 'price', 'price_info', 'description_1', 'description_2', 'about_product', 'features', 'specification']
        success_url = "products/product-list"
    

    I have cloned the repo and have used as app. I am trying to create a Product form and in the same form I want to add filefield to select and upload images. I am getting the above error. Frankly I did not understand how extra_views works. I just followed the readme and stuck here.

    Traceback:
    File "/home/kishor/workspace/gpsstops/env/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
      111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
    File "/home/kishor/workspace/gpsstops/env/local/lib/python2.7/site-packages/django/views/generic/base.py" in view
      69.             return self.dispatch(request, *args, **kwargs)
    File "/home/kishor/workspace/gpsstops/env/local/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch
      87.         return handler(request, *args, **kwargs)
    File "/home/kishor/workspace/gpsstops/extra_views/advanced.py" in get
      123.         return super(BaseCreateWithInlinesView, self).get(request, *args, **kwargs)
    File "/home/kishor/workspace/gpsstops/extra_views/advanced.py" in get
      85.         inlines = self.construct_inlines()
    File "/home/kishor/workspace/gpsstops/extra_views/advanced.py" in construct_inlines
      69.             inline_formset = inline_instance.construct_formset()
    File "/home/kishor/workspace/gpsstops/extra_views/formsets.py" in construct_formset
      31.         formset_class = self.get_formset()
    File "/home/kishor/workspace/gpsstops/extra_views/generic.py" in get_formset
      42.         result = generic_inlineformset_factory(self.inline_model, **self.get_factory_kwargs())
    File "/home/kishor/workspace/gpsstops/env/local/lib/python2.7/site-packages/django/contrib/contenttypes/forms.py" in generic_inlineformset_factory
      70.     ct_field = opts.get_field(ct_field)
    File "/home/kishor/workspace/gpsstops/env/local/lib/python2.7/site-packages/django/db/models/options.py" in get_field
      398.         raise FieldDoesNotExist('%s has no field named %r' % (self.object_name, name))
    
    Exception Type: FieldDoesNotExist at /products/product/add/
    Exception Value: ProductImages has no field named 'content_type'
    
  • Add initial_data support for formset

    Add initial_data support for formset

    There was a minor bug in the ModelFormsetMixin that was overriding the construct_formset method and not calling the get_initial_data method. It was a quick one line fix. Please pull as we have several developers using your excellent package.

  • ManagementForm Missing on CreateWithInlinesView

    ManagementForm Missing on CreateWithInlinesView

    How/Where is the management form in the context? I tried both {{ inlines.management_form }} and {{ form.management_form }}, but these don't work - hence the form doesn't validate.

    Using the simplest case, almost directly from the documentation:

    class SQDetailsInline(InlineFormSet):
        model = SQDetails
        fields = ('terminal','merchant',)
        exclude = ('pk','id','account')
        can_delete = False
        fk_name = 'account'
    
    class CreateOrderView(CreateWithInlinesView):
        model = SQAccount
        inlines = [SQDetailsInline]
        template_name = 'enter-order.html'
    
        def formset_valid(self,form):
            print form # this is here to force a 500
    
  • Formset kwargs (New)

    Formset kwargs (New)

    An up to date pull request for #115. Also addresses #123. A few notes on what I've done here:

    • Wherever possible. attempted to imitate functionality from FormView. That means calling get_initial and get_prefix to get class level attributes, but leaving all other kwargs to be set in either formset_kwargs or factory_kwargs. exclude and fields have been left at the class level for analogous reasons.
    • When setting mutable attributes at the class level, returning a copy of them to prevent them being modified.
    • can_delete is set to the default value automatically by the respective formset_factory of the class, so there is no need for us to set it by default.

    I was hoping to remove get_extra_form_kwargs completely but we need to wait until support is dropped for django 1.8.

  • passing initial data to a formset, doesn't show data_changed as true / does not save data

    passing initial data to a formset, doesn't show data_changed as true / does not save data

    Not sure if this is a deeper problem with Django ModelForms, or just this package.

    If I have a ModelFormSetView, to add Persons objects to a Trip object. I want to add some initial data to the forms, default names for each person, "Person 1", "Person 2" etc.

    class AddPersonsFormSetView(ModelFormSetView):
        model = Person
        template_name = 'AddPersons.html'
        extra = 1
        success_url = '/trip/%s/expense/add/'
    
         def get_formset_kwargs(self):
             kwargs = super(AddPersonsFormSetView, self).get_formset_kwargs()
             num_persons = self.kwargs['num_persons']
    
             ## inital data will give the name Person <increment> 
             initial = [ 
                 { 'name' : "Person %s" % i , 'trip' : self.kwargs['trip_id'] }  for i in range( 1, int(num_persons)+ 1)
             ]
    
             kwargs.update({'initial': initial })
             return kwargs
    

    Now if I change the values in the form, it saves correctly. If I leave the default values as they are, the PersonForm generated by the factory does not see the data_changed() as True, so doesn't save anything.

    I can work around this by creating the form, overriding the has_changed method, and specifying it in the get_factory_kwargs() method of the AddPersonFormSetView but this isn't an obvious solution until you step through the code. It doesn't not feel seem correct behaviour to ignore default values.

    class PersonForm(ModelForm):
        class Meta:
            model=Person   
    
        def has_changed(self):
            """
            Overriding this, as the initial data passed to the form does not get noticed, 
            and so does not get saved, unless it actually changes
            """
            changed_data = super(ModelForm, self).has_changed()
            return bool(self.initial or changed_data)
    
    
    
    class AddPersonsFormSetView(ModelFormSetView):
        ... 
        ... 
        def get_factory_kwargs(self):
            kwargs = super(AddPersonsFormSetView, self).get_factory_kwargs()
            kwargs['form'] = PersonForm
            return kwargs
    
  • Nested Formsets

    Nested Formsets

    Is it possible to do nested formsets with django-extra-views? I'm thinking of something along these lines: http://yergler.net/blog/2009/09/27/nested-formsets-with-django/ ... If it is possible, how would I do it?

    A secondary question: Is it possible to have a formset with nested forms? So I have a formset of Survey objects and I want each to also render/save/update a related model of

  • Documentation build at readthedocs.io is failing

    Documentation build at readthedocs.io is failing

    https://readthedocs.org/projects/django-extra-views/builds/5606569/

    Ideas on what we can do to get it buliding again...looks like the last build attempt was in June 2017... @jonashaag do you have access at readthedocs? Could you take a look or grant me some login details so I can try and get it working? Thanks.

  • customise and separate inline template tag

    customise and separate inline template tag

    Hi, {% for formset in inlines %} How Can I separate inline filed like this {{ formset.Major}} {{ formset.University}} not a hole {{ formset}} and how Can i add cusome design for this fileds like in forms.py 'NID': forms.NumberInput(attrs={'placeholder':'الرقم الوطني ', 'class': 'form-control'}),

  • Creating and saving new inline forms in an UpdateWithInlinesView-based form.

    Creating and saving new inline forms in an UpdateWithInlinesView-based form.

    Good day.

    I'm having trouble saving newly created inline forms in an UpdateWithInlinesView.

    I wrote some basic javascript to do the following:

    1. Duplicate an existing inline form.
    2. Increment numbering in the cloned form for all for, id, and name elements.
    3. Remove the pre-existing object ID (but leave the foreign key id).
    4. increment the TOTALFORMS value.

    What's strange is this script works just fine when used in conjunction with the CreateWithInlinesView to create and save one or more new inline forms to the database.

    I'm wondering if I need to do something specific in the view.py update view to support creating/validating new objects (in addition to updating the existing ones)?

    I've looked around for a solution but have not stumbled across anything that's been helpful. I tried setting the factory_kwargs: extra to 1 to see if there's something I'm missing, but this generates a RelatedObjectDoesNotExist error (which makes sense, since the parent id is not being passed to the new inline form).

    Any insight you might have would be very much appreciated. I'm also happy to share the javascript here, once everything is working appropriately.

    Thank you so much!

  • Handle pagination in ModelFormSetMixin

    Handle pagination in ModelFormSetMixin

    It's now even able to handle filtering with django-filter:

    class ManageClients(PermissionRequiredMixin, ContextTitleMixin, BaseModelFormSetView, FilterView):
        permission_required = 'clients.manage_clients'
        model = Client
        form_class = ClientForm
        filterset_class = ClientFilter
        fields = '__all__'
        template_name = 'clients/manage_clients.html'
        factory_kwargs = {'can_delete': True}
        title = _('Manage clients')
        ordering = 'date'
        paginate_by = 10
    
  • Validation of Inline Formset Based on Outer Form

    Validation of Inline Formset Based on Outer Form

    Background

    It took me a while to figure this out so I wanted to see if there was a way to simplify. I have a case where I want to make sure there are at least 1 valid form in a formset which is rendered as part of a larger form. However, the requirement to have at least one valid form is only needed if a field in the main form is in a certain state. I will try to explain this in the table below.

    Form Object State | At least 1 valid form required in an inline formset -------------------- | ------------------------------------------------------ Preliminary | No Ready for Approval | Yes Signatures Pending | Yes Approved | Yes

    The tricky part for me was that you can't do the validation in the form rendered in the formset because it requires knowledge of multiple forms in the formset. You can't do the validation at the formset level (including validate_min) because you need to know the state of the object in the outer form. You can't do the validation in the outer form because you need knowledge of the forms in the formset. Therefore, you can only do the validation in the CreateWithInlinesView and UpdateWithInlinesView.

    The way that I was able to solve this was to override the post() method of CreateWithInlinesView, UpdateWithInlinesView, and their parent class ProcessFormWithInlinesView.

    Suggestion

    Now that the background is out of the way, my suggestion is to add a new validation step to the post() method in order to perform this type of validation where information is needed from the form and the inline formset. I would be happy to contribute something if you agree this is a worthwhile endeavor.

    Thank you for a very useful library.

  • UpdateWithInlinesView not working with crispy_forms

    UpdateWithInlinesView not working with crispy_forms

    I am using 'extra_views' to create and update a model 'Patient' and its related model 'PatientAddress'. I am also using 'crispy_forms' to beautify the html form. CreateWithInlinesView works fine. The UpdateWithInlinesView however does not seem to play nice with crispy_forms. I have attached the requisite files, but I give a description of the problem below:

    In 'update.html', I have the following lines:

    DOES NOT WORK

    `
    {% csrf_token %}
    <div class="form-row">
        <div class="form-group col-md-8 mb-0">
            {{ form.name|as_crispy_field }}
        </div>
        <div class="form-group col-md-4 mb-0">
            {{ form.phone|as_crispy_field }}
        </div>
    </div>
    
    {% for formset in inlines %} {% for addr in formset %}
    <div class="form-row">
        <div class="form-group col-md-6 mb-0">
            {{ addr.line_1|as_crispy_field }}
        </div>
        <div class="form-group col-md-6 mb-0">
            {{ addr.line_2|as_crispy_field }}
        </div>
    </div>
    
    {% endfor %} {{ formset.management_form }} {% endfor %}
    
    <div class="control-group text-right">
        <div class="controls">
            <button type="submit" class="btn btn-default btn-person"><i class="fas fa-save"></i> Save</button>
        </div>
    </div>
    

    WORKS:

    `
    {% csrf_token %}
    <div class="form-row">
        <div class="form-group col-md-8 mb-0">
            {{ form.name|as_crispy_field }}
        </div>
        <div class="form-group col-md-4 mb-0">
            {{ form.phone|as_crispy_field }}
        </div>
    </div>
    
    {% for formset in inlines %}  {{ formset }} {% endfor %}
    
    <div class="control-group text-right">
        <div class="controls">
            <button type="submit" class="btn btn-default btn-person"><i class="fas fa-save"></i> Save</button>
        </div>
    </div>
    

    The first form comes back to the update page whereas the second form works but is not at all aesthetically nice. I am not quite sure what to do with this or how to proceed from here. I apologize in advance if this is not the appropriate place to post about this.

    code.zip

  • CreateWithInlinesView creating when inline form error

    CreateWithInlinesView creating when inline form error

    When you have any type of inlineform with CreateWithInlinesView, when you have the main form validated and the inlines have error, the main form are created even the inlines have error... Thats can't happened, right ?

Related tags
The best way to have DRY Django forms. The app provides a tag and filter that lets you quickly render forms in a div format while providing an enormous amount of capability to configure and control the rendered HTML.
The best way to have DRY Django forms. The app provides a tag and filter that lets you quickly render forms in a div format while providing an enormous amount of capability to configure and control the rendered HTML.

django-crispy-forms The best way to have Django DRY forms. Build programmatic reusable layouts out of components, having full control of the rendered

Jun 30, 2022
Super simple bar charts for django admin list views visualizing the number of objects based on date_hierarchy using Chart.js.
Super simple bar charts for django admin list views visualizing the number of objects based on date_hierarchy using Chart.js.

Super simple bar charts for django admin list views visualizing the number of objects based on date_hierarchy using Chart.js.

May 18, 2022
A generic system for filtering Django QuerySets based on user selections

Django Filter Django-filter is a reusable Django application allowing users to declaratively add dynamic QuerySet filtering from URL parameters. Full

Jul 3, 2022
Displaying objects on maps in the Django views and administration site.
Displaying objects on maps in the Django views and administration site.

DjangoAdminGeomap library The free, open-source DjangoAdminGeomap library is designed to display objects on the map in the Django views and admin site

Jun 26, 2022
Get inside your stronghold and make all your Django views default login_required

Stronghold Get inside your stronghold and make all your Django views default login_required Stronghold is a very small and easy to use django app that

Jul 6, 2022
Django query profiler - one profiler to rule them all. Shows queries, detects N+1 and gives recommendations on how to resolve them
Django query profiler - one profiler to rule them all.  Shows queries, detects N+1 and gives recommendations on how to resolve them

Django Query Profiler This is a query profiler for Django applications, for helping developers answer the question "My Django code/page/API is slow, H

Jun 30, 2022
Generate generic activity streams from the actions on your site. Users can follow any actors' activities for personalized streams.

Django Activity Stream What is Django Activity Stream? Django Activity Stream is a way of creating activities generated by the actions on your site. I

Jun 30, 2022
Reusable, generic mixins for Django

django-braces Mixins for Django's class-based views. Documentation Read The Docs Installation Install from PyPI with pip: pip install django-braces Bu

Jul 3, 2022
Flashback is an awesome, retro IRC based app built using Django
Flashback is an awesome, retro IRC based app built using Django

Flashback Flashback is an awesome, retro IRC based app built using Django (and the Django Rest Framework) for the backend as well as React for the fro

Dec 22, 2021
Awesome Django Markdown Editor, supported for Bootstrap & Semantic-UI
Awesome Django Markdown Editor, supported for Bootstrap & Semantic-UI

martor Martor is a Markdown Editor plugin for Django, supported for Bootstrap & Semantic-UI. Features Live Preview Integrated with Ace Editor Supporte

Jul 2, 2022
Awesome Django Blog App

Awesome-Django-Blog-App Made with love django as the backend and Bootstrap as the frontend ! i hope that can help !! Project Title Django provides mul

Feb 8, 2022
Add Chart.js visualizations to your Django admin using a mixin class
Add Chart.js visualizations to your Django admin using a mixin class

django-admincharts Add Chart.js visualizations to your Django admin using a mixin class. Example from django.contrib import admin from .models import

Jun 21, 2022
Automatic class scheduler for Texas A&M written with Python+Django and React+Typescript
Automatic class scheduler for Texas A&M written with Python+Django and React+Typescript

Rev Registration Description Rev Registration is an automatic class scheduler for Texas A&M, aimed at easing the process of course registration by gen

Jan 6, 2022
Repo for All the Assignments I have to submit for Internship Application !😅

Challenges Repository for All the Assignments I have to submit for Internship Application ! ?? As You know, When ever We apply for an Internship, They

Dec 31, 2021
An orgizational tool to keep track of tasks/projects and the time spent on them.

Django-Task-Manager Task Tracker using Python Django About The Project This project is an orgizational tool to keep track of tasks/projects and the ti

Dec 21, 2021
Create a netflix-like service using Django, React.js, & More.
Create a netflix-like service using Django, React.js, & More.

Create a netflix-like service using Django. Learn advanced Django techniques to achieve amazing results like never before.

Jun 29, 2022
A Django based shop system

django-SHOP Django-SHOP aims to be a the easy, fun and fast e-commerce counterpart to django-CMS. Here you can find the full documentation for django-

Jul 3, 2022
💨 Fast, Async-ready, Openapi, type hints based framework for building APIs
💨  Fast, Async-ready, Openapi, type hints based framework for building APIs

Fast to learn, fast to code, fast to run Django Ninja - Fast Django REST Framework Django Ninja is a web framework for building APIs with Django and P

Jun 29, 2022
The Django Leaflet Admin List package provides an admin list view featured by the map and bounding box filter for the geo-based data of the GeoDjango.
The Django Leaflet Admin List package provides an admin list view featured by the map and bounding box filter for the geo-based data of the GeoDjango.

The Django Leaflet Admin List package provides an admin list view featured by the map and bounding box filter for the geo-based data of the GeoDjango. It requires a django-leaflet package.

Dec 29, 2021