我有一个'野外'形式,它带有许多不同的变量 - 可能会也可能不会填充。
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 = ''
有没有更严格的方法来实现这一目标?
答案 0 :(得分:11)
app_version = request.REQUEST.get("appVersion", "")
get(key, default)
是在Python dicts
上实现的方法。如果密钥存在于字典中,则返回其值;如果密钥不存在,则返回指定的默认值。在Django中,request
对象是类字典对象,因此也以相同的方式为它们定义get
。
答案 1 :(得分: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.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 dict不包含appVersion键,那么该字段将留空。只要不需要该字段,您的表单仍将验证,并且您可以在验证后修改视图中的form.appVersion
。
答案 2 :(得分:6)
如果您有许多字段,则可能是更紧凑的版本:
defaults = { 'field1' : 'val1', 'field2' : 'val2', ...}
defaults.update(request.POST)