处理Django中的请求

时间:2013-04-17 07:15:39

标签: django

我刚开始使用Django,我有一些关于处理请求的基本问题。

说我是否有两个功能。

如果我有观点,请说

def test():
    return render(request, 'form.html')

在form.html中,我有一个包含method="POST"action="/submitted/"

的表单

所以现在如果我想对表单的提交数据做一些事情,我应该在同一个test()视图中执行它,或者我必须在另一个视图中执行它来处理`/提交/ URL?

我一直在用后者做,但后来我读到了这个: Need a minimal Django file upload example。 在这里,关于views.py的第4点,他们将表格与他们处理表格的视图相同。

这是如何工作的?这似乎非常不直观。或者我错过了什么?

3 个答案:

答案 0 :(得分:2)

在django中,GETPOST方法可以在同一视图中处理,除非您要将表单发布到与当前URL不同的URL。阅读以下代码:

urls.py

url(r'^test/$', 'myapp.views.test', name='test'),
url(r'^test_post/$', 'myapp.views.test_post', name='test_post'),

views.py

def test(request):
    #Do your regular get method processes here
    if request.POST:
        #Do something with post data here
    return render_to_response('form.html', locals(), context_instance = RequestContext(request))

def test_post(request):
    if request.POST:
        #Do something with post data here
    return render_to_response('form.html', locals(), context_instance = RequestContext(request))

如果您希望在同一视图中处理您的帖子数据test,请在表单中包含设置action=".",如下所示。

<form method="post" action="." id="form_id" name="form_name">

如果您希望在不同的视图test_post处理您的帖子数据,请在表单中包含设置action="/test_post/",如下所示。

<form method="post" action="/test_post/" id="form_id" name="form_name">

答案 1 :(得分:1)

在您的视图中,您将检查表单是否已过帐,如下所示。

def test(request): # A view always needs a request
    if request.method == "POST":
        # Do validation stuff here
    else:
        return render(request, 'form.html')

但我建议你看一下Django forms,它是一个内置函数,可以使表单和验证变得更加容易。

答案 2 :(得分:0)

上面的答案很棒,但是如果你仍然有点困惑,那么让我们分解你提供的一些信息,看看我们是否能够理解核心问题,即确定何时会发生什么。

如果您的函数“test()”被映射到诸如“/ test /”之类的URL ...那么我们也可以假设您试图找出提交到URL时会发生什么“/提交/".

  1. 在表单提交期间指向“表单操作”的地方是数据的去向(例如/提交/)。

  2. 如果您告诉表单在HTML表单代码中提交“/ submitted /”,那么所有表单数据处理都将在视图“submitted()”中处理,如果您提交你还没有(为了便于理解而假设命名)。

  3. 与arulmr建议的一样,根据您的示例场景,您的代码可能看起来像这样:

    def test(request):
        return render(request, 'form.html')
    
    def submitted(request):
        if request.POST:
            #Do something with post data here
        return render_to_response('form_message.html')
    
  4. 更为人熟知和“直观”的方法是让表单提交给自己,而不是另一个视图或URL。

    def test(request):
        if request.POST:
            #Do something with post data here
        return render_to_response('form_message.html')
    

    和...

    <form method="post" action=".">
    
  5. 'action =“。”'表示提交给自己。

    希望增加清晰度。