trco/django-funky-sheets

Django implementation of Handsontable spreadsheets for CRUD actions.

django
excel
handsontable
spreadsheets

Django Funky Sheets

Django implementation of Handsontable spreadsheets for CRUD actions.

::: {.contents depth="2" local="" backlinks="none"} Table of Contents :::

Test and experiment on your machine

Dockerfile and docker-compose.yml files for easy setup and testing on your machine are coming soon.

Installation

Install django-funky-sheets:

$ pip install django-funky-sheets

Add funky_sheets to your INSTALLED_APPS:

# settings.py

INSTALLED_APPS = [
    ...
    'funky_sheets',
    ...
]

Quick Start

URL

Define URLs for Create and Update views.

# urls.py

from django.urls import path
from . import views

urlpatterns = [
  path('', views.index, name='index'),
  path('create/', views.CreateMovieView.as_view(), name='create'),
  path('update/', views.UpdateMovieView.as_view(), name='update')
]

View

Define Create and Update views which inherit from HotView and render the Handsontable spreadsheet based on selected model fields.

# views.py

from django.forms import CheckboxSelectMultiple, CheckboxInput, DateInput
from django.urls import reverse_lazy

from funky_sheets.formsets import HotView

from .models import Movie

class CreateMovieView(HotView):
    # Define model to be used by the view
    model = Movie
    # Define template
    template_name = 'examples/create.html'
    # Define custom characters/strings for checked/unchecked checkboxes
    checkbox_checked = 'yes' # default: true
    checkbox_unchecked = 'no' # default: false
    # Define prefix for the formset which is constructed from Handsontable spreadsheet on submission
    prefix = 'table'
    # Define success URL
    success_url = reverse_lazy('update')
    # Define fields to be included as columns into the Handsontable spreadsheet
    fields = (
        'id',
        'title',
        'director',
        'release_date',
        'parents_guide',
        'imdb_rating',
        'genre',
        'imdb_link',
    )
    # Define extra formset factory kwargs
    factory_kwargs = {
        'widgets': {
            'release_date': DateInput(attrs={'type': 'date'}),
            'genre': CheckboxSelectMultiple(),
            'parents_guide': CheckboxInput(),
        }
    }
    # Define Handsontable settings as defined in Handsontable docs
    hot_settings = {
        'contextMenu': 'true',
        'autoWrapRow': 'true',
        'rowHeaders': 'true',
        'contextMenu': 'true',
        'search': 'true',
        # When value is dictionary don't wrap it in quotes
        'headerTooltips': {
            'rows': 'false',
            'columns': 'true'
        },
        # When value is list don't wrap it in quotes
        'dropdownMenu': [
            'remove_col',
            '---------',
            'make_read_only',
            '---------',
            'alignment'
        ]
    }

class UpdateMovieView(CreateMovieView):
  template_name = 'examples/update.html'
  # Define 'update' action
  action = 'update'
  # Define 'update' button
  button_text = 'Update'

Template

hot_template uses jQuery 3.3.1 and Handsontable 7.0.0.

If you would like to use different versions of jQuery and Handsontable you should create your own hot_template by copying default hot_template in funky_sheets/templates/hot/hot.html and loading selected versions of jQuery, Handsontable JavaScript and CSS. Note that the compatibility with different versions is not guaranteed. You should than include your custom hot_template when creating templates like create.html and update.html in the examples.

Define templates which include hot_template in place where you want to render Handsontable spreadsheet.

examples/create.html

...
{% include hot_template %}
...

examples/update.html

...
{% include hot_template %}
...

General information

Opening an issue

When reporting an issue for django-funky-sheets package, please prepare a publicly available repository having the issue you are reporting. The clear reproduce is the optimal way towards resolution.

Contribute

This is an Open Source project and any contribution is highly appreciated.

License

This project is licensed under the MIT License.

Stars
106
0.94% more than last month
Forks
21
Open Issues
8