【问题标题】:Redirected page isn't rendering after submitting modal form提交模态表单后重定向页面未呈现
【发布时间】:2016-02-28 01:07:36
【问题描述】:

我使用这些视图来处理带有表单的模态窗口。您可以在此处查看此方法的详细说明https://dmorgan.info/posts/django-views-bootstrap-modals/ 一切正常,但在重定向到此视图后,提交的数据不会出现在 my_orders 视图中。 我在 Chrome 控制台中看到对 /my_orders/ 的 GET 请求。响应包含提交的数据。但在我看来,这种回应似乎并没有呈现出来。可能是 XHR 响应造成的?

同时重定向在这种方法中工作正常,重定向后我得到了实际的 my_orders 视图。

def delete_order(request, id):
     Order.objects.filter(id = id).delete()
     return redirect('currency_exchange.views.my_orders')

views.py

def my_orders(request):
    queryset = Order.objects.filter(user=get_user(request))
    context = {
            "queryset": queryset
        }
    return render(request, "my_orders.html", context)

class AjaxTemplateMixin(object):

    def dispatch(self, request, *args, **kwargs):
        if not hasattr(self, 'ajax_template_name'):
            split = self.template_name.split('.html')
            split[-1] = '_inner'
            split.append('.html')
            self.ajax_template_name = ''.join(split)
        if request.is_ajax():
            self.template_name = self.ajax_template_name
        return super(AjaxTemplateMixin, self).dispatch(request, *args, **kwargs)

class AddOrderView(SuccessMessageMixin, AjaxTemplateMixin, FormView, CreateView):
     model = Order
     template_name = 'add_order_form.html'
     form_class = OrderForm
     success_url = reverse_lazy('my_orders')
     success_message = "Way to go!"

     def form_valid(self, form):
        order = form.save(commit=False)
        order.user = self.request.user
        order.save()
        return redirect('currency_exchange.views.my_orders')

JS:

var formAjaxSubmit = function(form, modal) {
                $(form).submit(function (e) {
                    e.preventDefault();
                    $.ajax({
                        type: $(this).attr('method'),
                        url: $(this).attr('action'),
                        data: $(this).serialize(),
                        success: function (xhr, ajaxOptions, thrownError) {
                            if ( $(xhr).find('.has-error').length > 0 ) {
                                $(modal).find('.modal-body').html(xhr);
                                formAjaxSubmit(form, modal);
                            } else {
                                $(modal).modal('toggle');
                            }
                        },
                        error: function (xhr, ajaxOptions, thrownError) {
                        }
                    });
                });
            }

【问题讨论】:

    标签: javascript jquery python ajax django


    【解决方案1】:

    你没有展示你的 JS。但是如果你发送一个 Ajax 请求,你需要在 JS 代码中做一些事情来真正做重定向。

    【讨论】:

    • 将JS添加到问题中
    • 好的。那么,在那个 JS 代码中,改变 URL 的地方是什么?
    • 更改 URL 的内容在 python 代码中:return redirect('currency_exchange.views.my_orders')。至少它可以工作在def delete_order()的情况下
    • 是的,我看到了,但这是一个 Ajax 请求,所以浏览器不会直接处理它。你需要编写一些 JS 代码来做任何事情:就像你编写一些 JS 来显示错误而不是仅仅出现在页面上一样,你需要编写一些 JS 来更改 URL。
    • 你是对的。我不知道什么方法是最好的,但是这个 window.location.replace('url'); 对我有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2020-02-18
    • 2020-05-27
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2020-04-06
    相关资源
    最近更新 更多