在Django中处理请求变量的最佳方法
我有一个表单'在野外',它有许多不同的变量 - 可能会或不会被填充。在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 = ''
是否有更紧密的方法来实现这一目标?
如果这些变量旨在填充表单,那么您可以安全地将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.POST
或request.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
。
app_version = request.REQUEST.get("appVersion", "")
get(key, default)
是关于Python dicts
实现的方法。如果密钥存在于字典中,则返回其值;如果该键不存在,则返回指定的默认值。在Django中,request
对象是类似字典的对象,所以get
也以相同的方式为它们定义。
这肯定是最Python化的答案。我正要将它标记为'''的答案,但我意识到下面的答案充分利用了我的模型定义,这比我所设想的更好。 – 2009-07-17 18:56:20
如果你有很多领域,更紧凑的版本可能是:
defaults = { 'field1' : 'val1', 'field2' : 'val2', ...}
defaults.update(request.POST)
和GET请求可以使用url正则表达式自动验证 – Evgeny 2009-07-16 23:41:46
我还没有意识到这一点,谢谢! – sixthgear 2009-07-17 00:44:04