Django Form中的request.user

时间:2011-12-02 14:12:07

标签: python django

我在访问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参数创建表单,而不使用它,两者都有效。

4 个答案:

答案 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...