request.user в форме Джанго - PullRequest
0 голосов
/ 02 декабря 2011

У меня проблема с доступом к данным POST формы Django.

Мне нужно передать 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, но я хочу иметь возможность создавать форму с пользовательским параметром и без него, оба работают.

Ответы [ 4 ]

5 голосов
/ 02 декабря 2011

вам, вероятно, следует передать пользователя создателю формы даже с данными 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
2 голосов
/ 02 декабря 2011

pop вызовет KeyError, если он не имеет значения по умолчанию. Так что вам просто нужно передать значение по умолчанию - вероятно, None:

user = kwargs.pop('user', None)
1 голос
/ 02 декабря 2011

Если вы хотите, чтобы форма работала без пользователя, измените конструктор на:

user = kwargs.pop('user', None)

Но тогда вам придется иметь дело с user, являющимся None.

0 голосов
/ 02 декабря 2011

Предложение 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...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...