Reputation: 689
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'
]
Upvotes: 2
Views: 4207
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
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