Перенаправление на Django View после AJAX GET-запроса с предварительно заполненной формой
У меня есть ListView
для рендеринга страница с таблицей объектов. Первый столбец - это чекбоксы для выполнения некоторых действий над несколькими объектами (не набор форм). Каждый checkbox содержит объект id
в виде value
и использует AJAX-запросы для выполнения этих действий.
С прямым POST
запросом проблем нет, так как я отправляю кучу ids
в массиве, проверяю их через форму и update()
.
Однако я испытываю некоторые трудности с запросом GET
, который должен быть более простым:
У меня есть представление для редактирования объекта (FBV). Цель состоит в том, чтобы перенаправить на это представление с полем, содержащим все те ids
, которые были проверены на ListView
. Но я только что узнал, что я не могу вызвать render()
после вызова AJAX, поэтому мне интересно, какой правильный способ обработки такого перенаправления, передающего initial
данные форме, представленной в контексте этого представления.
Упрощенный код:
class ProducutsListView(ListView):
model = models.Product
template_name = "production/products_list.html"
paginate_by = 50
Вид, на который нужно перенаправить:
def product_update_view(request):
if request.method == "POST":
form = forms.ProductUpdateForm(
request.POST,
)
if form.is_valid():
products = form.cleaned_data["products"]
-------------------------------------
# some more validated data extracting
-------------------------------------
products.update(**fields)
return redirect("products_list")
else:
form = forms.ProductUpdateForm()
if is_ajax(request):
products_form = forms.ProductsMultipleForm(request.GET) # form contains only one field "poducts" represents an array of objects
if products_form.is_valid():
products = products_form.cleaned_data["products"]
form = forms.ProductUpdateForm(
initial={"products": products}
)
**# how to render a page with form contains `init` data?**
return render(request, "production/product_update.html", {"form": form})
JS / AJAX:
// there are multiple Map() objects each contains **view url**, **button** triggers request and **method** of request.
var $buttonsList = [asTested, setOnStock, configChange];
$.each($buttonsList, function () {
var $url = this.get("url");
var $btn = this.get("btn");
var $method = this.get("method");
$btn.on("click", function () {
$.ajax({
type: $method,
headers: $method == "POST" ? { "X-CSRFToken": CSRF } : {},
url: $url,
dataType: "json",
traditional : true,
data: {"products": getProductIds()},
success: function (response) {
if ($method == "POST") {
location.reload();
};
},
});