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.

Вернуться на верх