Generic AjaxCreateView

- Allows for same form to be posted
This commit is contained in:
Oliver 2018-04-25 14:10:56 +10:00
parent 8bc4050d05
commit d88da28871
6 changed files with 98 additions and 59 deletions

View File

@ -0,0 +1,65 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.template.loader import render_to_string
from django.http import JsonResponse
from django.views.generic import UpdateView, CreateView, DeleteView
class AjaxView(object):
ajax_form_action = ''
ajax_form_title = ''
ajax_submit_text = 'Submit'
def getAjaxTemplate(self):
if hasattr(self, 'ajax_template_name'):
return self.ajax_template_name
else:
return self.template_name
def renderJsonResponse(self, request, form):
context = {'form': form,
'form_action': self.ajax_form_action,
'form_title': self.ajax_form_title,
'submit_text': self.ajax_submit_text,
}
data = {'form_valid': form.is_valid()}
data['html_form'] = render_to_string(
self.getAjaxTemplate(),
context,
request=request
)
return JsonResponse(data)
class AjaxCreateView(AjaxView, CreateView):
def post(self, request):
if request.is_ajax():
form = self.form_class(request.POST)
if form.is_valid():
form.save()
return self.renderJsonResponse(request, form)
else:
return super(CreateView, self).post(request)
def get(self, request):
if request.is_ajax():
form = self.form_class()
return self.renderJsonResponse(request, form)
else:
return super(CreateView, self).post(request)

View File

@ -12,11 +12,6 @@
</div>
</div>
<button type='button' class='btn btn-primary js-create-cat'>
<span class='glyphicon glyphicon-plus'></span>
New Category
</button>
{% if children.all|length > 0 %}
<h4>Part Categories</h4>
{% include "part/category_subcategories.html" with children=children %}
@ -26,9 +21,9 @@
{% include "part/category_parts.html" with parts=parts %}
<div class='container-fluid'>
<a href="{% url 'category-create' %}">
<button class="btn btn-success">New Category</button>
</a>
<button type='button' class='btn btn-primary js-create-cat'>
New Category
</button>
<a href="{% url 'part-create' %}">
<button class="btn btn-success">New Part</button>
</a>
@ -49,7 +44,17 @@ $(document).ready(function () {
$("#modal-cat").modal("show");
},
success: function (data) {
$("#modal-cat .modal-content").html(data.html_form);
if (data.html_form) {
$("#modal-cat .modal-content").html(data.html_form);
}
else {
alert('JSON response missing form data');
$("#modal-cat").modal("hide");
}
},
error: function (xhr, ajaxOptions, thrownError) {
alert("Error requesting form data:\n" + thrownError);
$("#modal-cat").modal("hide");
}
});
});
@ -63,12 +68,15 @@ $(document).ready(function () {
type: form.attr('method'),
dataType: 'json',
success: function (data) {
if (data.form_valid) {
alert("Success!");
}
else {
if (data.html_form) {
$("#modal-cat .modal-content").html(data.html_form);
}
else {
alert('No form data!');
}
},
error: function (xhr, ajaxOptions, thrownError) {
alert("Error submitting form data:\n" + thrownError);
}
});

View File

@ -1 +0,0 @@
{% include 'modal_form.html' with title='Create new Part Catagory' %}

View File

@ -48,7 +48,7 @@ part_bom_urls = [
part_urls = [
# Create a new category
url(r'^category/new/?', views.CategoryCreateJson.as_view(), name='category-create'),
url(r'^category/new/?', views.CategoryCreate.as_view(), name='category-create'),
# Create a new part
url(r'^new/?', views.PartCreate.as_view(), name='part-create'),

View File

@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.template.loader import render_to_string
from django.shortcuts import get_object_or_404
from django.http import HttpResponseRedirect
from django.http import JsonResponse
from django.urls import reverse_lazy
from django.views.generic import DetailView, ListView
from django.views.generic.edit import UpdateView, DeleteView, CreateView
@ -20,6 +19,7 @@ from .forms import EditBomItemForm
from .forms import EditSupplierPartForm
from InvenTree.views import AjaxCreateView
class PartIndex(ListView):
model = Part
@ -133,45 +133,12 @@ class CategoryDelete(DeleteView):
return HttpResponseRedirect(self.get_object().get_absolute_url())
class CategoryCreateJson(CreateView):
class CategoryCreate(AjaxCreateView):
model = PartCategory
template_name = 'part/partial_category_new.html'
form_class = EditCategoryForm
def renderJsonResponse(self, request, form, data):
context = {'form': form}
data['html_form'] = render_to_string(self.template_name,
context,
request=request)
return JsonResponse(data)
def post(self, request):
form = self.form_class(request.POST)
data = {}
if form.is_valid():
form.save()
data['form_valid'] = True
else:
data['form_valid'] = False
return self.renderJsonResponse(request, form, data)
def get(self, request, *args, **kwargs):
form = self.form_class()
data = {}
return self.renderJsonResponse(request, form, data)
class CategoryCreate(CreateView):
model = PartCategory
template_name = 'part/partial_category_new.html'
ajax_form_action = reverse_lazy('category-create')
ajax_form_title = 'Create new part category'
ajax_template_name = 'modal_form.html'
template_name = 'part/category_new.html'
form_class = EditCategoryForm
def get_context_data(self, **kwargs):

View File

@ -1,10 +1,10 @@
<form method="post" action='/part/category/new/' class='js-modal-form'>
<form method="post" action='{{ form_action }}' class='js-modal-form'>
{% csrf_token %}
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h4 class="modal-title">Form Title Here</h4>
<h4 class="modal-title">{{ form_title }}</h4>
</div>
<div class="modal-body">
{% load crispy_forms_tags %}
@ -12,6 +12,6 @@
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="submit" class="btn btn-primary">Submit</button>
<button type="submit" class="btn btn-primary">{{ submit_text }}</button>
</div>
</form>