Heenashree Khandelwal
Heenashree Khandelwal

Reputation: 689

Django IntegrityError null value in column "author_id" violates not-null constraint

I am trying to save a form where I take user inputs. I am getting Integrity error. Can anyone please help me out here? I see that people have used request.user.username but I don't see how to use this in my forms. Please don't mind the code as I am still trying to figure out things in Django.

Below are my files:

models.py

class CommonModel(models.Model):

    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length=400)
    comments = models.TextField(blank=True)
    requirements = JSONField(default = {})
    specs = JSONField(default= {})
    created_date = models.DateTimeField(default=timezone.now)
    updated_date = models.DateTimeField(blank=True, null=True)

    class Meta:
       abstract = True

    def update(self):
        self.updated_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title


class Item(CommonModel):

    HW = 'HW'
    NW = 'NW'
    SW = 'SW'
    VM = 'VM'
    WI = 'WI'
    SI = 'SI'
    ITEM_TYPES = (
        (HW, 'Hardware'),
        (NW, 'Network'),
        (SW, 'Software'),
        (VM, 'Virtual Machine'),
        (WI, 'Work Item'),
        (SI, 'Support Item'), 
    )

    UNIT_LOE = 'LOE'
    UNIT_USD = 'USD'
    UNIT_TYPES = (
        (UNIT_LOE, 'LOE,MD'),
        (UNIT_USD, 'USD'),
    )

    item_type = models.CharField(default='HW', max_length=5, choices=ITEM_TYPES)
    unit_type = models.CharField(default='USD', max_length=5, choices=UNIT_TYPES)
    otc_price = models.DecimalField(default='0.0', max_digits=10, decimal_places=2)
    annual_price = models.DecimalField(default='0.0', max_digits=10, decimal_places=2)
    gp_code = models.TextField(default='Unknown')
    class Meta:
       abstract = True

class ItemTemplate(Item):
    pass
   # Need ID here to relate to estimate

class ItemObject(Item):
    pass

Here is my admin.py

class CommonAdmin(admin.ModelAdmin):

    formfield_overrides = {
        JSONField:{ 'widget':JSONEditor },
    }

    def otc_price(self,obj):       
        return json_prettified(obj.otc_price)
    def annual_price(self,obj):       
        return json_prettified(obj.annual_price)

from reversion.admin import VersionAdmin

@admin.register(ItemTemplate)
class ItemTemplateAdmin(VersionAdmin):
     list_display = ('title', 'item_type', 'unit_type', 'otc_price','annual_price')
     formfield_overrides = {
        JSONField:{ 'widget':JSONEditor },
     }

@admin.register(ItemObject)
class ItemObjectAdmin(VersionAdmin):
     list_display = ('title', 'item_type', 'unit_type', 'otc_price','annual_price')
     formfield_overrides = {
        JSONField:{ 'widget':JSONEditor },
     }

And finally the views.py.

def order_create(request):
        cart = ItemObject.objects.all()

        if request.method == 'POST':
            form = ItemObjectCreateForm(request.POST)
            if form.is_valid():
                form.save()
                for item in cart:
                    annual_price = 122
                    otc_price=100
                    # Logic to calculate the price and put it in estimate table
                    ItemObject.objects.create(
                                             requirements=item.requirements,
                                             specs=item.specs,
                                             annual_price = annual_price,

                    )
                # clear the cart
                #cart.clear()
                order_created()
                # redirect to the payment
                return redirect('success.html')

        else:
            form = ItemObjectCreateForm()
        return render(request,
                      'index.html',
                      {'cart': cart, 'form': form})

Here I am trying to store data to ItemObject but while submitting the form, I am getting error.

IntegrityError: null value in column "author_id" violates not-null constraint
DETAIL:  Failing row contains 

Also my forms.py is like below

class ItemObjectCreateForm(forms.ModelForm):
    class Meta:
        model = ItemObject
        fields = ['title','requirements', 'gp_code', 'specs','author', 'item_type', 'unit_type','comments', 'id'
                  ]

Attaching DB enter image description here

Upvotes: 2

Views: 4207

Answers (2)

Saji Xavier
Saji Xavier

Reputation: 2360

While form save, set commit argument to false to prevent the object being saved immediately,

item = form.save(commit=False)
item.author = request.user
item.save()

And modify

ItemObject.objects.create( author=request.user, requirements=item.requirements, specs=item.specs, annual_price = annual_price, )

Upvotes: 1

VMatić
VMatić

Reputation: 996

In your definition of CommonModel you've required that author not be null. Is that correct? Must every instance of CommonModel have an author? If not, you can alter the definition to allow null values:

author = models.ForeignKey('auth.User', default=None, null=True, blank=True)

Upvotes: 0

Related Questions