Views

WebixTemplateView (used for webix rendering)

To use instead of TemplateView to can override these extra functions.

from django_webix.views import WebixTemplateView
class CustomView(WebixTemplateView):
    template_name = 'base.html'

    qxs_layers # only for GIS support

    def get_container_id(self, request):
        return settings.WEBIX_CONTAINER_ID

    def get_overlay_container_id(self, request):
        return getattr(settings, 'WEBIX_OVERLAY_CONTAINER_ID', settings.WEBIX_CONTAINER_ID)

Base Template

Create a base html template (e.g. <app_name>/templates/base.html)

{% load i18n %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    {% include "django_webix/static_meta.html" %}
</head>
<body>
</body>

<script type="text/javascript" charset="utf-8">
    webix.ready(function () {
        webix.ui({
            id: 'content_right',
            rows: []
        });

        webix.extend($$('content_right'), webix.OverlayBox);

        load_js('{% url 'myapplication.mymodel.list' %}');
    });
</script>
</html>

WebixFormView

Custom View for manage WebixForm and WebixModelForm

from django_webix.utils.decorators import script_login_required
from django_webix.views.generic.base import WebixFormView
@method_decorator(script_login_required, name='dispatch')
class AttrezzaturaMasterSlave(WebixFormView):
    form_class = CustomWebixForm

WebixListView

Mainly is based on a model and his queryset.

from django_webix.views import WebixListView
from <app_name>.models import MyModel

class MyModelListView(WebixListView):
    model = MyModel

    footer = True
    order_by = None
    actions = []  # [multiple_delete_action]

    # paging
    enable_json_loading = True
    paginate_count_default = 100
    paginate_start_default = 0
    paginate_count_key = 'count'
    paginate_start_key = 'start'

    # template vars
    template_name = 'django_webix/generic/list.js'
    title = None
    actions_style = None # ['buttons', 'select']
    enable_column_webgis = True
    enable_column_copy = True
    enable_column_delete = True
    enable_row_click = True
    type_row_click = 'single'  # or 'double'
    enable_actions = True


    def get_initial_queryset(self,):
        return super().get_initial_queryset()

    fields = [
        { # char example
            'field_name': 'XXX',
            'datalist_column': '''{id: "XXX", serverFilterType:"icontains", header: ["{{_("TEXT1")|escapejs}}", {content: "serverFilter"}], fillspace: true, sort: "server"}'''
        },
        { # FK example
            'field_name': 'YYYY',
            'datalist_column': ''' {id: "YYYY", serverFilterType:"exact", header: ["{{_("TEXT2")|escapejs}}", {content: "serverSelectFilter", options:YYYY_options}], adjust: "all", sort: "server"}'''
        },
        { # number example (in this case by interface is possibile to write for example "<=5" )
            'click_action': '''custom_js_function_to_add_into_js(el['id']);''',
            'field_name': 'ZZZZ',
            'footer': Sum('ZZZZ'),
            'datalist_column': '''{id: "ZZZZ", serverFilterType:"numbercompare", header: ["{{_("TEXT3")|escapejs}}", {content: "numberFilter"}], css: {'text-align': 'right'}, adjust: "all", sort: "server"}'''
        },
    ]

There some example for filtering:

  • TextField ex. serverFilterType:”icontains” {content: “serverFilter”}
  • FloatField ex. serverFilterType:”numbercompare” {content: “numberFilter”}
  • ForeignKey ex. serverFilterType:”exact” {content: “serverSelectFilter” options:YYYY_options}
  • DateField ex. serverFilterType:”range” {content: “serverDateRangeFilter”}
  • BooleanField ex. use template:custom_checkbox_yesnonone and add {content: “serverSelectFilter” , options:[{id: ‘True’, value: ‘Yes’}, {id: ‘False’, value: ‘No’}] }

WebixCreateView and WebixUpdateView

WebixCreateUpdateMixin

class WebixCreateUpdateMixin:
    logs_enable = True
    errors_on_popup = False
    enable_button_save_continue = True
    enable_button_save_addanother = True
    enable_button_save_gotolist = True
    template_style = 'standard' # ['standard', 'tabs', 'monotabs']

Inlines

from django_webix.formsets import WebixTabularInlineFormSet, WebixStackedInlineFormSet
from <app_name>.models import InlineModel

class InlineModelInline(WebixStackedInlineFormSet):
    model = InlineModel
    fields = '__all__'

    def get_queryset(self): # eventually override
        return self.inline_model.objects.filter(**filters)

Custom formset for Inlines

from django_webix.formsets import BaseWebixInlineFormSet

class CustomInlineFormSet(BaseWebixInlineFormSet):
    # ...

class InlineModelInline(WebixStackedInlineFormSet):
    # ...
    custom_formset_class = CustomInlineFormSet
    # ...

WebixCreateView and WebixUpdateView

from django_webix.formsets import WebixTabularInlineFormSet, WebixStackedInlineFormSet
from django_webix.views import WebixListView, WebixCreateView, WebixUpdateView, WebixDeleteView

from <app_name>.forms import MyModelForm
from <app_name>.models import MyModel, InlineModel

class InlineModelInline(WebixStackedInlineFormSet):
    model = InlineModel
    fields = '__all__'

class MyModelCreateView(WebixCreateView):
    model = MyModel
    inlines = [InlineModelInline]
    form_class = MyModelForm
    model_copy_fields = []

def pre_forms_valid(self, form=None, inlines=None, **kwargs):
    '''
    Before all data saving
    '''
def post_form_save(self, form=None, inlines=None, **kwargs):
    '''
    After form save and before inlines save
    '''
def post_forms_valid(self, form=None, inlines=None, **kwargs):
    '''
    After all data saved
    '''

CreateView and UpdateView Signals

When createview and updateview work some signals are sended.

django_webix_view_pre_save.send(sender=self,
                instance=None,
                created=True,
                form=form,
                inlines=inlines)
django_webix_view_pre_inline_save.send(sender=self,
                   instance=self.object,
                   created=True,
                   form=form,
                   inlines=inlines)
django_webix_view_post_save.send(sender=self,
                instance=self.object,
                created=True,
                form=form,
                inlines=inlines)

WebixDeleteView

class MyModelDeleteView(WebixDeleteView):
    model = MyModel

    def pre_delete_valid(self):
        pass

    def post_delete_valid(self):
        pass

    def get_failure_delete_related_objects(self, request, obj=None):
        return []

DeleteView Signals

When deleteview works some signals are sended.

django_webix_view_pre_delete.send(sender=self, instance=self.object)
django_webix_view_post_delete.send(sender=self, instance=self.copied_object)