处理Django中的请求

Handling requests in Django

我刚开始Django,对于处理请求我有几个基本问题。

如果我有两个功能。

如果我有观点,说

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

在form.html中,我有一个带有method="POST"action="/submitted/"的表单。

所以现在,如果我想对提交的表单数据做些什么,我是应该在同一个test()视图中做,还是必须在另一个处理`/submitted/url的视图中做?

我一直在和后者合作,但后来我读到:需要一个最小的django文件上传示例。在这里,在关于views.py的第4点中,他们的观点与处理表单的观点相同。

这是怎么回事?这似乎很不具有说服力。还是我错过了什么?


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

网址.py

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

号视图.py

1
2
3
4
5
6
7
8
9
10
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))

如果您希望在同一视图中处理您的日志数据,那么请按照下面给出的格式将集合action="."包括在内。

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

如果您希望在不同的视图中处理您的日志数据,那么请按照下面给出的格式将集合action="/test_post/"包括在内。

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


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

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

但我建议您看一下django表单,它是一个内置的函数,使表单和验证变得容易得多。


上面的答案很好,但是如果您仍然有点困惑,让我们把您提供的一些信息分解一下,看看我们是否能够理解核心问题,这就是确定什么时候会发生什么。

如果您的函数"test()"映射到一个URL,例如"/test/"..然后,我们还可以假设您正在尝试了解当您提交到url"/submitted/"时会发生什么。

  • 在表单提交过程中指向"表单操作"的地方就是数据的去处(例如/submitted/)。

  • 如果您告诉表单在HTML表单代码中提交到"/submitted/",那么所有表单数据处理都将在视图"submitted()"中处理,如果您还没有进行处理,则必须进行该视图(为了便于理解,假设命名)。

  • 就像Arulmr建议的那样,根据您的示例场景,您的代码可能看起来像这样:

    1
    2
    3
    4
    5
    6
    7
    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')

  • 更广为人知和"直观"的方法是让表单提交给自己,而不是另一个视图或URL。

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

    还有…

    1
    <form method="post" action=".">
  • "action="""表示服从自己。

    希望这能增加清晰度。