Haikal Nashuha
Haikal Nashuha

Reputation: 3048

UnboundLocalError local variable <variablename> referenced before assignment

I faced the error when I tried to capture the POST data from a form. Weird, because the same algorithm works with another django app model.

The models:

class Item(models.Model):
    code = models.CharField(max_length=200, unique=True)
    barcode = models.CharField(max_length=300)
    desc = models.CharField('Description',max_length=500)
    reg_date = models.DateField('registered date')
    registrar = models.CharField(max_length=100)
    def __unicode__(self):
       return self.code + ' : ' + self.desc

class ItemInfo(models.Model):
    model = models.ForeignKey(Item)
    supplier = models.ForeignKey(Supplier)
    stock_on_hand = models.IntegerField()
    stock_on_order = models.IntegerField()
    cost = models.IntegerField()
    price = models.IntegerField()
    unit = models.CharField(max_length=100)
    lead_time = models.IntegerField()

    def __unicode__(self):
        return Item.code + ' : ' + supplier

class ItemForm(ModelForm):
     class Meta:
         model = Item

class ItemInfoForm(ModelForm):
     class Meta:
        model = ItemInfo
        exclude = ('model')

And the views.py function for non-working (Item) is like this:

def register(request):
    csrf_context = RequestContext(request)
    current_user = User
    if request.user.is_authenticated():
        if request.POST:
            item = Item()
            item_info = ItemInfo()

            header_form == ItemForm(data=request.POST,instance=item)
            details_form == ItemInfoForm(data=request.POST, instance=item_info)

            if header_form.is_valid():
                 header = header_form.save()

                if details_form.is_valid():
                    details = details_form.save(commit=False)
                    details.supplier = header
                    details.save()
                    return HttpResponseRedirect('/item/')
               else:
                    return render_to_response('error/denied_data_entry.html')
         else:
             header_form = ItemForm()
             details_form = ItemInfoForm()
         return render_to_response('item/register.html',{'header_form' : header_form, 'details_form' : details_form}, csrf_context)
    else:
         return render_to_response('error/requires_login.html', csrf_context)

The working views.py function for another working (Supplier) model is here:

def register(request):
    csrf_context = RequestContext(request)
    current_user = User    
    if request.user.is_authenticated():
        if request.POST:
             supplier = Supplier()
             supplier_info = SupplierInfo()

             header_form = SupplierForm(data=request.POST, instance=supplier)
             details_form = SupplierInfoForm(data=request.POST, instance=supplier_info)

             if header_form.is_valid():
                 header = header_form.save()

                 if details_form.is_valid():
                     details = details_form.save(commit=False)
                     details.model = header
                     details.save()
                     return HttpResponseRedirect('/supplier/')
                 else:
                     return render_to_response('error/denied_data_entry.html')
             else:
                 return render_to_response('error/denied_data_entry.html')
         else:  
             header_form = SupplierForm()
             details_form = SupplierInfoForm()
             return render_to_response('supplier/register.html', {'header_form' : header_form, 'details_form' : details_form}, csrf_context)
    else:
        return render_to_response('error/requires_login.html', csrf_context)  

The traceback page shows that the POST did pass some variable. Help me please, I cant figure it out why it works on Supplier, but not Item.

P/S: Sorry for the indentation.

Upvotes: 0

Views: 2229

Answers (1)

juliomalegria
juliomalegria

Reputation: 24921

The problem is here:

# ...
header_form == ItemForm(data=request.POST,instance=item)
details_form == ItemInfoForm(data=request.POST, instance=item_info)

You're not assigning, you're comparing.

Upvotes: 3

Related Questions