Django modelform не сохраняется
Вот мое мнение:
@login_required
def createPackage(request):
if request.method == "POST":
print(request.POST)
p_form = packageCreateForm(request.POST, instance=request.user)
if p_form.is_valid():
p_form.save()
x = p_form.cleaned_data.get('pickup_phoneNumber')
y = p_form.cleaned_data.get('item')
print(x,y)
messages.success(request, f'Hi {request.user.username} you have successfully created an order with POST BOX oure customer care reperesntative will reach out to you soon ')
return redirect('post-box-home')
else:
print("-----Form is not valid-----")
else:
p_form = packageCreateForm()
return render(request, 'packages/createPackage.html', {'p_form': p_form})
Это форма:
from django import forms
from .models import Package
class packageCreateForm(forms.ModelForm):
class Meta:
model = Package
fields = ['item', 'description', 'weight', 'quantity', 'Contained_In', 'pickup_phoneNumber', 'delivery_phoneNumber', 'pickup_address','delivery_address']
Это модель:
class Package(models.Model):
customer=models.ForeignKey(User, on_delete=models.CASCADE )
item = models.CharField(max_length=250)
description= models.TextField()
package_no =models.IntegerField(default=0)
weight = models.FloatField()
quantity= models.IntegerField(default=1)
drop_off = models.BooleanField(default=False)
pickup_address= models.TextField()
Contained_In = models.CharField(choices=CONTAINED_LIST, max_length=3, help_text='Select the package you item can be contained in', default= "")
delivery_address= models.TextField()
pickup_phoneNumber= PhoneNumberField(default = '')
delivery_phoneNumber= PhoneNumberField(default = '')
pickup_price=models.FloatField(default=0.00)
delivery_price=models.FloatField(default=0.00)
package_status=models.CharField(choices=PACKAGE_STATUS_LIST, max_length=3,help_text='Select a status for this pacakage', default= "")
request_date = models.DateTimeField(auto_now_add=True)
updated_date = models.DateTimeField(auto_now=True)
# note = models.ManyToManyField(User, on_delete=models.CASCADE )
def __str__(self):
return self.item
Я действительно не знаю, что я делаю неправильно, форма проходит тест на валидность, но ничего не сохраняется в базе данных.
Пожалуйста, я также поделился моделью, я не знаю, может ли она быть оттуда.
Package
модель имеет customer
поле ForeignKey, вы передаете instance=request.user
в packageCreateForm
и не передаете его в конструкторе, т.е. в __init__()
форме, поэтому вы сначала делаете commit=False
затем сохраняете его customer
поле, так:
@login_required
def createPackage(request):
if request.method == "POST":
print(request.POST)
p_form = packageCreateForm(request.POST)
if p_form.is_valid():
package=p_form.save(commit=False)
package.customer=request.user
package.save()
x = p_form.cleaned_data.get('pickup_phoneNumber')
y = p_form.cleaned_data.get('item')
print(x,y)
messages.success(request, f'Hi {request.user.username} you have successfully created an order with POST BOX oure customer care reperesntative will reach out to you soon ')
return redirect('post-box-home')
else:
print("-----Form is not valid-----")
else:
p_form = packageCreateForm()
return render(request, 'packages/createPackage.html', {'p_form': p_form})
Примечание: классы записываются в
PascalCase
, поэтому вы можете записать это какPackageCreateForm
, а не как.packageCreateForm