有没有办法从Django表单中获取数据并将其上传到数据库?

时间:2020-08-21 18:22:02

标签: python django

我正在尝试从Django表单中提取数据并将其上传到数据库中。

这是我的模特:

class Category(models.Model):
    category = models.CharField(max_length = 128)

    def __str__(self):
        return f"{self.category}"
    class Meta:
        verbose_name_plural = 'Categories'

class Listing(models.Model):
    user = models.ForeignKey(User, on_delete = models.CASCADE,  default = None)
    title = models.CharField(max_length = 64)
    description = models.TextField(max_length = 128)
    bid = models.ForeignKey(Bid, on_delete = models.CASCADE, related_name = 'listing')
    url = models.URLField(max_length = 350, blank = True)
    category = models.ManyToManyField(Category, related_name='listings')
    watchers = models.ManyToManyField(User, blank = True, related_name='listings')

因此,当用户添加新列表时,他们应该从类别中进行选择。经过大量尝试后,这是我的操作方式:

def new_listing(request):
    if request.method =="POST":
        form = ListingForm(request.POST)
        if form.is_valid():
            bid = Bid(amount = int(request.POST['bid']))
            bid.save()
            listing = Listing()
            listing.bid = bid
            listing.user = request.user
            listing.title = form.cleaned_data['title']
            listing.description = form.cleaned_data['description']
            listing.url = form.cleaned_data['url']  
            listing.save()
            listing = Listing.objects.reverse()[0]
            for category in form.cleaned_data['category']:
                listing.category.add(category)          

这里的问题是我必须先保存列表,然后再将其拉出并手动添加 Categories 。我只是想知道是否有更清洁的方法?还是这是在Django中完成的?因为'我很难做得更干净。

此外,表单是Django生成的,如下所示:

class ListingForm(ModelForm):
    class Meta:
        model = Listing
        fields = ['title', 'description', 'url', 'category']

这也是创建表单的好习惯吗,还是我应该选择forms.Form

1 个答案:

答案 0 :(得分:0)

在处理多对多关系时,您需要在save之前add是正确的。 不过,您不需要进行反向查找,add可以接受许多对象,而不仅仅是documentation

中可以看到的对象。
listing.save()
listing.category.add(*form.cleaned_data["category"])

对于ModelForm,可以使用它,因为您正试图获取一个表单来创建模型。如果这是一种自定义表单,则可以执行其他操作,则需要使用forms.Form