2014-01-14 48 views
-1

我已经阅读了很多关于在Django中创建和处理表单的文档,但是我仍然对实现的某些方面感到困惑。具体来说,我无法理解我应该在哪里处理由表单发送的数据。它是在使用表单模板的视图还是在另一个视图上?表单数据在哪里处理? (Django)

例如,假设有一个单一形式的索引模板:

*index.html* 
{% load url from future %} 
<form action="{% url 'Directories:_results'%}" method="post"> 
Name: <input type="text" name="txtField" /> 
<input type="submit" name="submit" /> 
</form> 

所以现在我认为我有两个版本:

#1版(1个视图):同样的观点显示器和处理表单

def index(request): 
    if request.method == 'POST': # If the form has been submitted... 
     form = dbForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): # All validation rules pass 
      field = form.cleaned_data['txtField'] 
      #doSomething 
    else: 
     form = dbForm() #unbound form 
    return render(request, 'Directories/index.html', {'form': form}) 

#2版(2次):一个视图中显示第E型和一个视图处理表单数据

#the view that creates the form (unbound) 
def index(request): 
    form = dbForm() 
    return render(request, 'Directories/index.html', {'form':form}) 

#the view that handles the data sent during form submission in the index template. 
def results(request): 
    if request.method == 'POST': 
     form = dbForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): # All validation rules pass 
      field = form.cleaned_data['txtField'] 
      #doSomething 
    else: 
     form = dbForm() #unbound form 
    return render(request, 'Directories/index.html', {'form': form}) 

,这里是我的urls.py:

from django.conf.urls import patterns, url 
from Directories import views 

urlpatterns = patterns('', 
    url(r'^$', views.index, name='_index'), 
    url(r'^results$', views.results, name='_results'),) 

正如你可以看到每一个版本,因此我想进行数据处理不同要知道这些是否是错误的,如果两者都是正确的,那么哪一个被认为是最佳实践。

+1

不知道你为什么要问这个,真的。在版本2中,第二个视图与版本1中的视图完全相同:那么版本2中的第一个视图有什么意义? –

+0

对于这个过于简化的示例版本2似乎是多余的,但是我想了解的是在哪里处理数据?因此,我没有试图强调这个例子本身,而是强调它背后的概念以及哪个版本被认为是最佳实践。例如,在一个更复杂的例子中,你必须处理多个表单,每个表单都有多个提交按钮,与版本1相比,版本2可以更好地分离问题。我相信这取决于你处理的情况,但是我的问题更像是什么规范 – per7inac1ousQ

回答

2

通常,表单将发布到它正在显示的相同视图。

可以简化视图逻辑,像这样:

def index(request): 
    form = dbForm(data=request.POST or None) 
    if form.is_valid(): # All validation rules pass 
     field = form.cleaned_data['txtField'] 
     #doSomething 
     return redirect(success_url) 
    return render(request, 'Directories/index.html', {'form': form}) 

注意,如果你在成功的表单提交重定向它通常是不错的,即使你重定向回同样的观点。这可以防止用户刷新页面时提示“重新发送表单数据”。

你应该看看文档在模板呈现形式:
https://docs.djangoproject.com/en/dev/topics/forms/#looping-over-the-form-s-fields

如果不渲染领域的错误,例如,用户将永远不知道问题是什么。

将发布到不同视图的表单的一个示例是,如果您的基本模板具有出现在每个页面上的“搜索”表单。当您发布此表单时,您不想回到当前视图,您想要转到“搜索结果”视图。

1

通常,一个视图对应一个url。此外,相同的网址应显示表单并接受提交的表单。有了这个逻辑,你的第一种方法更好。一个视图显示并接受该表单。

但是,在某些情况下,显示窗体的视图与接受窗体的视图不同。例如,具有多个表单的页面。每个表单可以提交到不同的视图。但是可以实施不同的视图来处理该网址并显示这种形式。

0

首先要理解的是,处理表单的视图通常也是首先显示表单的视图 - ,因为它必须在出现错误时再次显示表单

在模板中,你完全采用手工打造的HTML表单。这是不常见的,因为如果出现错误(通常是未填写的必填字段),您希望再次呈现表单,并且所有已输入的值都存在,并且出现错误消息。 Django的表单呈现({{ form.as_p }}之类)为你做这件事,如果你像这样手工编写HTML,你就不会得到它。其实你的观点错过的还有:根据条款上is_valid(),它导致

所以通常认为做到这些,除了第二件事就明白了:一个成功的POST之后,你总是重定向的更迭页面,或可能到同一页面(这将再次显示一个空表格)。大多数情况下,用户不会意外地用刷新按钮重新提交表单。

所以,你的第一个是典型的,除非你还需要在is_valid()的情况下返回ResponseRedirect来完成,而应该呈现更多形式的模板。不需要第二个视图。

1

没有什么错或者,它取决于你想要做什么。默认情况下,表单中的数据发送到同一个请求,但你可以将数据发送到不同的观点,如果这是更方便

在大多数情况下,它通常是简单的使用了同样的观点。使用两种观点是好的,如果你正在使用外部工具\程序\无论或者如果你想收紧你的安全性(具有第二视图只接受用POST数据例如请求等等),但将需要额外的步骤(错误处理,成功的重定向)