django unboundlocalerror formset - PullRequest
       12

django unboundlocalerror formset

0 голосов
/ 17 февраля 2011

У меня есть набор форм, который позволяет пользователю давать несколько наград пользователю за пожертвование в его проект.

Если я попаду на страницу и не введу никакой информации, отправлю, я получу UnboundLocalError, что кажется странным, поскольку я проверяю, является ли форма действительной, а также набор форм.

Exception Type: UnboundLocalError at /projects/new/
Exception Value: local variable 'reward' referenced before assignment

Views.py

def new(request, template_name='projects/new.html'):

if request.POST:

    form = UserSubmittedProjectForm(request.POST, request.FILES)
    if form.is_valid():
        project = form.save(commit=False)
        reward_formset = RewardFormSet(request.POST, instance=project)
        if reward_formset.is_valid():
            slug = request.POST.get("project_name")
            project.slug = slugify(slug)
            project.status = 'PR'
            project.owner = request.user
            project.money_raised = 0
            project.date_published = datetime.now()
            project.save()
            form.save_m2m()
            reward_formset.save()
            signals.post_save.connect(notify_admins, sender=Project)
            return HttpResponseRedirect('/projects/')
else:
    form = UserSubmittedProjectForm()
    reward = RewardFormSet(instance=Project())

context = { 'form':form,'reward':reward, }

return render_to_response(template_name, context,
    context_instance=RequestContext(request))

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Вы называете formset разными вещами - reward_formset в блоке POST, но просто reward в блоке не POST. Если это POST и он недействителен, он провалится на дно, где код ожидает переменную reward, которая не была определена.

Будьте последовательны в именах переменных.

0 голосов
/ 17 февраля 2011

'награда' видна только в блоке else, переместите переменные для достижения правильной области видимости, например:

def new(request, template_name='projects/new.html'):

    form = UserSubmittedProjectForm()
    reward = RewardFormSet(instance=Project())

    if request.POST:
       form = UserSubmittedProjectForm(request.POST, request.FILES)
       ...    

    context = { 'form':form,'reward':reward, }

    return render_to_response(template_name, context,
        context_instance=RequestContext(request))
...