Django 表单中的 request.user
我在访问Django表单的POST数据时遇到了问题。
我需要把请求中的用户信息(request.user)传递给表单,所以我这样做:
class TradeForForm(forms.Form):
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
else:
request = kwargs.pop('request')
super(TradeForForm, self).__init__(*args, **kwargs)
#Obtain items for user
if user:
print user
items = Item.objects.filter(user=user)
choices = []
for i in range(len(items)):
choices.append([i,items[i].name])
self.fields['item_to_be_traded_for'].choices = choices
trade_type = forms.ChoiceField(
widget=RadioSelect(),
choices = [
['0','Item'],
['1','Money offer'],
]
)
item_to_be_traded_for = forms.ChoiceField()
然后用下面的方式调用它:
def trade_for(request, item_id):
item = Item.objects.get(id=item_id)
if request.method == 'POST':
form = TradeForForm(request.POST)
if form.is_valid():
pass
else:
form = TradeForForm(user=request.user)
variables = RequestContext(request, {
'form': form,
'item': item,
})
return render_to_response('trade_for.html', variables)
现在问题来了,当我用GET请求访问空表单时,一切正常。但是当我提交表单时,我收到了一个错误:
KeyError at /trade_for/1/
'user'
Request Method: POST
Request URL: http://localhost:8000/trade_for/1/
Django Version: 1.3.1
Exception Type: KeyError
Exception Value:
'user'
那么这个问题该怎么解决呢?我猜是因为在用请求的POST数据创建表单时,用户变量没有被传递进去,但我希望能够在有用户参数和没有用户参数的情况下都能创建表单,并且都能正常工作。
4 个回答
1
如果你想让这个表单在没有用户的情况下也能正常工作,可以把构造函数改成这样:
user = kwargs.pop('user', None)
不过,这样的话你就得处理一下 user
变成 None
的情况。
2
如果你用 pop
方法去取一个字典里不存在的键,就会出现一个叫做 KeyError 的错误。为了避免这个错误,你可以给 pop
方法提供一个默认值,通常可以用 None
来作为默认值:
user = kwargs.pop('user', None)
5
你可能应该把用户传给表单的创建者,即使是带着POST
数据,这样才能正确验证选择。所以
TradeForForm(request.POST, user=request.user)
如果你不想这样做,你需要把user = kwargs.pop('user')
改成类似下面的东西
user = kwargs.pop('user', None)
# if kwargs has no key 'user', user is assigned None
# make sure your code handles this case gracefully