1

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

假设我有两个功能。

如果我有看法,请说

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

在 form.html 我有一个表格method="POST"action="/submitted/"

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

我一直在使用后者,但后来我读到了这个: 需要一个最小的 Django 文件上传示例。在这里,在关于 的第 4 点中views.py,他们以与处理表单相同的视图制作表单。

这是如何运作的?这似乎很不直观。还是我错过了什么?

4

3 回答 3

2

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

网址.py

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

视图.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">
于 2013-04-17T07:29:40.187 回答
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,它是一个内置函数,使表单和验证变得更加容易。

于 2013-04-17T07:21:48.307 回答
0

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

如果在这种情况下您的函数“test()”被映射到诸如“/test/”之类的 URL...那么我们也可以假设您试图弄清楚当您提交到 URL 时会发生什么“/submitted /”。

  1. 在表单提交期间,“表单操作”指向的地方就是数据所在的位置(例如/submitted/)。

  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=".">
    

'action="."' 意味着提交给自己。

希望增加清晰度。

于 2013-04-17T08:59:22.707 回答