Django – 如何处理前端的ajax form submit 请求?通过json返回处理结果,不要重定向(redirect)

题材背景

每当web应用开发中,经常碰到需要像用户注册提交个人信息,或者录入商品信息的求。在浏览器上相似以一个Form表单来含有用户所有需要输入的控件。那么浏览器需要以用户输入完所有消息之后,
将表单中的连带数据传送给后台,完成多少的录入。

Form submit

于火狐的开发者教程被,对Form submit有不行好之求证跟说mozilla’s sending
and retrieving form
data。
在温和遭遇产生涉及,
form表单中之action定义了表单数据将会让作朝什么地方。说及此处,
就不得不提一下Post/Redirect/Get。

PRG都被腾到了防备表单重复提交数据的同样栽Web设计模式。
说的凡采用在遵循像在电商提交订单这种情景下,总不可知于客户还提交订单吧。字面意思是,后端在接受用户提交的表单数据,并以正确处理之后,
应该被前者重定向到另外一个URL。
就笔者看来,虽然连无克全理解,但总的说来对于什么设计模式,
什么最佳实践,还是应该心存敬畏,能遵守的就算遵从。

Ajax submit

于用ajax来付form表单, 请先押一下之下链接。

  • https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Sending\_forms\_through\_JavaScript
  • https://scotch.io/tutorials/submitting-ajax-forms-with-jquery\#getting-started
  • https://code.tutsplus.com/tutorials/submit-a-form-without-page-refresh-using-jquery–net-59
    Ajax提交用户表单和人情Form submit提交有以下重点分:

Ajax提交是浏览器在后台发送请求至服务器,
也是在后台受到服务器返回的结果还开拍卖;
Form submit处理是在交付数据以后, 后台返回重定向命令,
浏览器还接后,去拜谒命令中指明的URL。

此外Ajax是局部刷新浏览器, 无法处理重定向命令。

问题: Reverse for *** not found. *** is not a valid view function or pattern name.

说了如此多, 是因为作者于Django后台处理ajax上传的表单数据的时候,
心心念念的如果兑现重新定向/PRG。
以以redirect方法的当儿,出现了该问题,在网上搜寻了一会,发现大家比较少遇到该问题,主要找到之信息是在template中使url的时段有关的音。

  • urls.py

urlpatterns = [
    url(r'^$', views.SkuView.as_view(), name='sku'),
    # download sku template
    url(r'^download/$', views.download, name='download'),
    # sku import / add
    url(r'^skuimport/$', views.skuimport.as_view(), name='skuimport'),

    #  book query 
    url(r'^book/query/$', views.books.as_view(), name='books'),

    # add book 
    url(r'^add/$', views.addBook.as_view(), name='addBook')

]
  • views.py

class addBook(generic.View):
    def get(self, request):
        if request.method == "GET":
            print "addBook get GET reqeuest"
            dumpRequest(request)
            return render(request, 'p_bookAdd.html');

    def post(self, request):
        if request.method == "POST":
            error = ''
            success = ''
            dumpRequest(request)
            form = bookAddForm(request.POST)
            if form.is_valid():
                isbn = form.cleaned_data['isbn']
                if Book.objects.filter(isbn = isbn).exists():
                    error = "ISBN %d book exist !" %(isbn)
                else:
                    success = "True"
                    b = Book(**form.cleaned_data)
                    b.save()

                resp = {
                    'success': success,
                    'error': error
                }
                return redirect('addBook')

Django报错的音信如下:

Internal Server Error: /sku/add/
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.9-py2.7.egg/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.9-py2.7.egg/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.9-py2.7.egg/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.9-py2.7.egg/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.9-py2.7.egg/django/views/generic/base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "/home/fall4u/PycharmProjects/Django-metronic-learn/sku/views.py", line 111, in post
    return redirect('addBook')
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.9-py2.7.egg/django/shortcuts.py", line 56, in redirect
    return redirect_class(resolve_url(to, *args, **kwargs))
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.9-py2.7.egg/django/shortcuts.py", line 147, in resolve_url
    return reverse(to, args=args, kwargs=kwargs)
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.9-py2.7.egg/django/urls/base.py", line 91, in reverse
    return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))
  File "/usr/local/lib/python2.7/dist-packages/Django-1.11.9-py2.7.egg/django/urls/resolvers.py", line 497, in _reverse_with_prefix
    raise NoReverseMatch(msg)
NoReverseMatch: Reverse for 'addBook' not found. 'addBook' is not a valid view function or pattern name.

实际报错原因就指出的百般显然也, 就是redirect的参数不针对,
看起应当不是addBook。
然被丁困惑的凡合法文档吃有之例子就是是如此,没有再次多外信息。

解决办法

以redirect的参数改吗0return
redirect(‘sku:addBook’)
,看来要命名空间的题材。

Django 处理ajax form 请求

言归正传, Django处理form请求, 一般以以下步骤处理

  1. 验证form数据要是否合法(is_valid)
  2. 拍卖form数据,比如保持数据库什么的
  3. 布局json数据返回

def post(self, request):
    if request.method == "POST":
        error = ''
        success = ''
        form = bookAddForm(request.POST)
        if form.is_valid():
            isbn = form.cleaned_data['isbn']
            if Book.objects.filter(isbn = isbn).exists():
                error = "ISBN %d book exist !" %(isbn)
            else:
                success = "True"
                b = Book(**form.cleaned_data)
                b.save()
            resp = {
                'success': success,
                'error': error
            }
            return HttpResponse(json.dumps(resp), content_type="application/json")

相关文章