2009-07-16 41 views
1

我有一个表单'在野外',它有许多不同的变量 - 可能会或不会被填充。在Django中处理请求变量的最佳方法

try: 
     app_version = request.REQUEST["appVersion"] 
    except: 
     app_version = '' 

    try: 
     app_name = request.REQUEST["appName"] 
    except: 
     app_name = '' 

    try: 
     app_code_name = request.REQUEST["appCodeName"] 
    except: 
     app_code_name = '' 

是否有更紧密的方法来实现这一目标?

回答

8

如果这些变量旨在填充表单,那么您可以安全地将request.POST对象直接传递给窗体构造函数。

if request.method == 'POST': 
    form = MyForm(request.POST) 

的形式将自动传递正确的价值观,以正确的表单字段 ,并使用默认值不存在 并仍将创建丢失的钥匙空白字段(见附录)键。

如果您正在尝试处理表单,最好还是像上面那样创建表单对象,然后从该对象中读取值。

if request.method == 'POST': 
    form = MyForm(request.POST) 
    if form.is_valid(): 
     # You may process these variables here 
     print form.appVersion 
     print form.appName 
     print form.appCodeName 

请记住,验证码最好放在表单类中。这样,如果form.is_valid()返回True,那么你知道你有一个干净的数据集来处理。

注意:Django文档建议直接使用request.POSTrequest.GET而不是混合变量request.REQUEST,因为它更明确。

附录:

了解在这种情况下,绑定和非绑定形式之间的差别是非常重要的。如果您使用form = MyForm()创建未绑定表单,那么当表单实例化时,它将填充每个字段(如果存在)的initial属性的所有字段。例如,使用此代码:

from django import forms 

class MyForm(forms.Form): 
    appVersion = forms.CharField(initial='1.0') 
    appName = forms.CharField() 
    appCodeName = forms.CharField() 

表单将使用值为'1.0'的appVersion进行初始化。但是,如果您将POST请求绑定到如下形式:form = MyForm(request.POST),则会忽略初始属性。这意味着如果POST字典不包含appVersion键,那么该字段将留空。只要该字段不是必需的,您的表单仍将进行验证,您可以在验证后在视图中修改form.appVersion

+1

和GET请求可以使用url正则表达式自动验证 – Evgeny 2009-07-16 23:41:46

+0

我还没有意识到这一点,谢谢! – sixthgear 2009-07-17 00:44:04

11
app_version = request.REQUEST.get("appVersion", "") 

get(key, default)是关于Python dicts实现的方法。如果密钥存在于字典中,则返回其值;如果该键不存在,则返回指定的默认值。在Django中,request对象是类似字典的对象,所以get也以相同的方式为它们定义。

+0

这肯定是最Python化的答案。我正要将它标记为'''的答案,但我意识到下面的答案充分利用了我的模型定义,这比我所设想的更好。 – 2009-07-17 18:56:20

6

如果你有很多领域,更紧凑的版本可能是:

defaults = { 'field1' : 'val1', 'field2' : 'val2', ...} 
defaults.update(request.POST) 
相关问题