Невозможность сохранения определенных атрибутов из ModelForm в базу данных django (логическая ошибка)

У меня есть форма ModelForm под названием ListingForm. Она принимает данные от пользователя, но я запретил некоторым атрибутам модели появляться в этой форме, так как хочу сам подавать на них данные. Я поместил операторы печати в свою функцию createlisting в views.py, чтобы проверить, правильно ли сохраняются данные, и оказалось, что данные сохраняются. Вот функция createlisting:

def create_listing(request):
    if request.method == 'POST':
        import datetime
        listing_form = ListingForm(request.POST, request.FILES)
        if listing_form.is_valid():
            bid = listing_form.cleaned_data['starting_bid']
            print(bid)
            listing_form.save(commit=False)
            listing_form.user = request.user
            print(listing_form.user)
            listing_form.date_made = datetime.datetime.today()
            listing_form.is_active = True
            listing_form.category = Category.objects.get(name=listing_form.cleaned_data['listing_category'])
            print(listing_form.category)
            #The form is being saved correctly here, and the print statements give the correct results in my terminal
            listing_form.save()
            Bid.objects.create(user= request.user, value=bid, listing=listing_form.instance)
            all_listings = Listing.objects.all()
            return render(request, 'auctions/index.html', {
                'all_listings': all_listings })
        
    else:
        listing_form = ListingForm()
        return render(request, 'auctions/createlisting.html',{
        'listing_form':listing_form
    })

Однако, когда я пытаюсь получить доступ к данным из модели Listing, от которой наследуется ListingForm, операторы печати, которые я поместил для отладки, возвращают значения по умолчанию для некоторых полей (категория и пользователь) вместо значений, которые я сохранил в ListingForm. Вот код, который позволяет мне просмотреть данные для созданного мною экземпляра модели. Обратите внимание, что все остальные поля сохранились правильно, за исключением полей category и user:

def view_listing(request, listing_id):
    listing = Listing.objects.get(pk=listing_id)
    #the print results return the default values for the fields category and user instead of the values I saved in my ModelForm
    print(listing.category)
    print(listing.user)

    if request.user == listing.user:
        return render(request, 'auctions/view_listing.html', {
             'listing': listing,
             'flag':True,
             'count': listing.bids.all().count()
        
        })
    else:
        return render(request, 'auctions/view_listing.html',{
           'listing':listing,
           'count': listing.bids.all().count() 
        })

Что может быть проблемой в моем коде?

Кроме того, позвольте мне предоставить код некоторых моих моделей и форму, поскольку ошибка может быть заложена в них:

Listing Model:

class Listing(models.Model):
    NAME_CHOICES = [ 
        ('Fashion', 'Fashion'),
        ('Toys','Toys'),
        ('Electronics','Electronics'),
        ('Home', 'Home'),
        ('Other', 'Other')
    ]
    
    title = models.CharField(max_length= 64)
    date_made = models.DateTimeField(auto_now_add=True)
    description = models.TextField()
    user = models.ForeignKey(User, to_field='username', on_delete=models.CASCADE, related_name='user_listings', null=True)
    starting_bid = models.DecimalField(decimal_places=2, max_digits=264, default=10.00)
    upload_image = models.ImageField(blank=True, upload_to='media/media')
    category = models.ForeignKey(Category, on_delete=models.CASCADE, to_field='name', related_name='category_listings', default=NAME_CHOICES[4][0], db_constraint=False)
    listing_category = models.CharField(max_length=12, choices=NAME_CHOICES, null=True, default=NAME_CHOICES[4][0])
    is_active = models.BooleanField(default=True)
    watchlist = models.ForeignKey('Watchlist', on_delete=models.DO_NOTHING, related_name='listings', null=True)

Category Model:

class Category(models.Model):
    NAME_CHOICES = [ 
        ('Fashion', 'Fashion'),
        ('Toys','Toys'),
        ('Electronics','Electronics'),
        ('Home', 'Home'),
        ('Other', 'Other')
    ]

    name = models.CharField(max_length=12, choices= NAME_CHOICES, unique=True)

User Model:

class User(AbstractUser):
    def __str__(self):
        return f'{self.username} '

ListingForm`` (ModelForm``):

class ListingForm(ModelForm):
    class Meta:
        model = Listing
        exclude = [
            'date_made',
            'user',
            'category',
            'is_active',
            'watchlist'
        ]

Любая форма помощи была бы очень признательна.

При вызове listing_form.save(commit=False) возвращается несохраненный экземпляр модели с представленными значениями. Если вы присвоите его переменной, вы можете использовать его для установки значений других полей и сохранения:

def create_listing(request):
    if request.method == 'POST':
        import datetime
        listing_form = ListingForm(request.POST, request.FILES)
        if listing_form.is_valid():
            bid = listing_form.cleaned_data['starting_bid']
            listing = listing_form.save(commit=False)
            listing.user = request.user
            listing.date_made = datetime.datetime.today()
            listing.is_active = True
            listing.category = Category.objects.get(name=listing_form.cleaned_data['listing_category'])
            listing.save()
            Bid.objects.create(user=request.user, value=bid, listing=listing)
            # You should probably use HttpResponseRedirect to an `all_listings` page, rather than displaying them here
            all_listings = Listing.objects.all()
            return render(request, 'auctions/index.html', {
                'all_listings': all_listings })

Вот ссылка на ModelForm.save() docs.

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