# django-crud-mixins CRUD and form mixins for Django. Useful for single-page-applications using Gridstack. # Usage Add to your `requirements.txt` file: ``` git+https://git.zm.is/XF/django-crud-mixins ``` ## View helpers The view helpers help create simple CRUD views for your application. They are geared towards a single-page application using Gridstack, but can be used on full pages as well by specifying a `type` of `page` always. The view permission helpers add a `user=request.user` argument to all queryset filters, ensuring your views can only access the data of the requesting user. Additional filters can be set by overriding the `set_extra_args` method (detailed below). Import the helpers from your view: ``` from mixins.views import ObjectCreate, ObjectDelete, ObjectList, ObjectRead, ObjectUpdate ``` Then, add the views: ```python class AccountList(LoginRequiredMixin, OTPRequiredMixin, ObjectList): list_template = "partials/account-list.html" model = Account page_title = "List of accounts" list_url_name = "accounts" list_url_args = ["type"] submit_url_name = "account_create" class AccountCreate(LoginRequiredMixin, OTPRequiredMixin, ObjectCreate): model = Account form_class = AccountForm submit_url_name = "account_create" class AccountUpdate(LoginRequiredMixin, OTPRequiredMixin, ObjectUpdate): model = Account form_class = AccountForm submit_url_name = "account_update" class AccountDelete(LoginRequiredMixin, OTPRequiredMixin, ObjectDelete): model = Account ``` ### Variables These variables can be added to the classes to adjust functionality: Basic: * `list_template`: the name of the template for the list view * `model`: the model you want to view with this helper * `page_title`: the page title to render * `page_subtitle`: the page subtitle to render List URLs: * `list_url_name`: the name of the list URL to include in the context, passed as `list_url` * `list_url_args`: arguments for the above, taken from view kwargs, or locals Submit URLs: * `submit_url_name`: the name of the submit URL to include in the context, passed as `submit_url` -- used in the form * `submit_url_args`: arguments for the above, taken from view kwargs, or locals For `ObjectList` only: * `delete_all_url_name`: the name of the delete-all URL to include in the context, passed as `delete_all_url` -- used in the form's "Delete all" button * `widget_options`: options for the Gristack widget For `ObjectCreate` and `ObjectUpdate` only: * `hide_cancel`: whether to hide the cancel button in the form For `ObjectUpdate` only: * `pk_required`: whether the primary key `pk` is required in the URL kwargs ### Methods These methods can be added to the classes to adjust functionality: For `ObjectCreate` and `ObjectUpdate` only: * `post_save(self, obj)`: called after the object has been saved For `ObjectCreate` only: * `pre_save_mutate(self, user, obj)`: called before the object is saved, AbortSave can be raised with an error message to abort the save These methods can be used on all classes, as they are inherited from the `RestrictedViewMixin`: * `set_extra_args(self, user)`: adjusts the queryset filter with extra parameters, set `self.extra_permission_args` from this method to a dictionary of arguments ## Form permission helper The form permission helper `RestrictedFormMixin` can be used as a mixin in your forms: ```python class YourModelForm(RestrictedFormMixin, ModelForm): class Meta: model = YourModel fields = ( "name", ) ``` It's that simple! The form will automatically add a `user=request.user` argument to all queryset filters, ensuring your forms can only access the data of the requesting user.