Django 表单中的 request.user

0 投票
4 回答
6467 浏览
提问于 2025-04-17 07:32

我在访问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

撰写回答