我在访问Django Form 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'
现在如何解决这个问题?我假设这是因为用户变量在使用request.POST数据创建时没有传递给表单,但是我希望能够使用user参数创建表单,而不使用它,两者都有效。
答案 0 :(得分: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
答案 1 :(得分:2)
pop
会引发KeyError,除非它具有默认值。所以你只需要传递一个默认值 - 可能是None
:
user = kwargs.pop('user', None)
答案 2 :(得分:1)
如果希望表单在没有用户的情况下工作,请将构造函数更改为:
user = kwargs.pop('user', None)
但是你必须能够处理user
None
。
答案 3 :(得分:0)
user = kwargs.pop('user', None)
的建议是您遗失代码的一部分。一个更好的方法是放弃你自己的参数,以避免所有弹出!
class TradeForForm(forms.Form):
def __init__(self, user=None, request=None, *args, **kwargs):
super(TradeForForm, self).__init__(*args, **kwargs)
if user:
...code here...