繁体   English   中英

无法将某些属性从 ModelForm 保存到 django 数据库(逻辑错误)

[英]Failure to save certain attributes from ModelForm to django database (Logic error)

我有一个名为ListingForm的 ModelForm 。 它从用户那里获取数据,但我已经阻止了一些模型属性以这种形式出现,因为我想自己将数据提供给那些人。 我在views.pycreatelisting函数中放置了打印语句,以检查数据是否实际保存正确,结果证明数据正在保存。 这是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
    })

但是,当我尝试从ListingForm继承的模型Listing中访问数据时,我为调试而放置的打印语句返回某些字段(类别和用户)的默认值,而不是我保存在ListingForm中的值. 这是允许我查看我创建的模型实例的数据的代码。 请注意,除了字段categoryuser之外,所有其他字段都已正确保存:

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`` (模型表格```):

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()文档的链接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM