簡體   English   中英

UnboundLocalError:在 DJANGO 中賦值之前引用了局部變量“formset”

[英]UnboundLocalError: local variable 'formset' referenced before assignment in DJANGO

嘿,所以我有這個活動列表,這些活動有一個按鈕來開始和停止這個過程。

'''

from django.shortcuts import render
from .models import Campaign
from .forms import CampaignForm, CampaignStatusFormSet

def home_view(request):
    queryset = Campaign.objects.all()

    if request.method == 'POST':
        form_type = request.POST.get('id')
        if form_type == 'campaign_status':
            formset = CampaignStatusFormSet(
                request.POST, request.FILES,
                queryset=queryset,
            )
            for form in formset.forms:
                if form.is_valid():
                    form.save()
    else:
        formset = CampaignStatusFormSet(queryset=queryset)

    campaigns_and_forms = list(zip(queryset, formset))

    context = {
        'formset': formset,
        'campaigns_and_forms': campaigns_and_forms,
    }

    return render(request, 'campaigns_in_progress.html', context)

'''

但是當我運行它並單擊按鈕更改播放/暫停時,它會顯示此錯誤。

UnboundLocalError:分配前引用的局部變量“formset”

誰能幫我重構這段代碼,使它不顯示這個錯誤?

您可以刪除 else 塊,以便即使在單擊播放/暫停按鈕后表單集也可用。 當您發送 POST 請求並且campaign_status 符合預期時,formset 變量在conext中不可用,因此出現錯誤。

  from django.shortcuts import render
  from .models import Campaign
  from .forms import CampaignForm, CampaignStatusFormSet
  
  def home_view(request):
      queryset = Campaign.objects.all()
  
      if request.method == 'POST':
          form_type = request.POST.get('id')
          if form_type == 'campaign_status':
              formset = CampaignStatusFormSet(
                  request.POST, request.FILES,
                  queryset=queryset,
              )
              for form in formset.forms:
                  if form.is_valid():
                      form.save()
            # Set form with new created campaign         
            queryset = Campaign.objects.all()
            formset = CampaignStatusFormSet(queryset=queryset)

            campaigns_and_forms = list(zip(queryset, formset))

            context = {
                'formset': formset,
                'campaigns_and_forms': campaigns_and_forms,
            }

      else:
        formset = CampaignStatusFormSet(queryset=queryset)
        campaigns_and_forms = list(zip(queryset, formset))

        context = {
            'formset': formset,
            'campaigns_and_forms': campaigns_and_forms,
        }

    return render(request, 'campaigns_in_progress.html', context)

您可以為此應用一個 hacky 解決方案。 使用formset值創建一個表單集變量。 希望它能解決您的問題。

代碼:

from django.shortcuts import render
from .models import Campaign
from .forms import CampaignForm, CampaignStatusFormSet

def home_view(request):
    queryset = Campaign.objects.all()
    formset = ""
    if request.method == 'POST':
        form_type = request.POST.get('id')
        if form_type == 'campaign_status':
            formset = CampaignStatusFormSet(
                request.POST, request.FILES,
                queryset=queryset,
            )
            for form in formset.forms:
                if form.is_valid():
                    form.save()
    else:
        formset = CampaignStatusFormSet(queryset=queryset)

    campaigns_and_forms = list(zip(queryset, formset))

    context = {
        'formset': formset,
        'campaigns_and_forms': campaigns_and_forms,
    }

    return render(request, 'campaigns_in_progress.html', context)

我不知道這是否是正確的解決方案,如果它不會破壞其他東西,但現在它工作得很好。 我只是在 if 語句之前聲明了表單集,所以它聲明了 2 次。

'''

def home_view(request):
    queryset = Campaign.objects.all()

    formset = CampaignStatusFormSet(
        request.POST, request.FILES,
        queryset=queryset,
    )

    if request.method == 'POST':
        form_type = request.POST.get('id')
        if form_type == 'campaign_status':
            formset = CampaignStatusFormSet(
                request.POST, request.FILES,
                queryset=queryset,
            )
            for form in formset.forms:
                if form.is_valid():
                    form.save()
    else:
        formset = CampaignStatusFormSet(queryset=queryset)

    campaigns_and_forms = list(zip(queryset, formset))

    context = {
        'formset': formset,
        'campaigns_and_forms': campaigns_and_forms,
    }

    return render(request, 'campaigns_in_progress.html', context)

'''

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM