我正在尝试从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
?
答案 0 :(得分:0)
在处理多对多关系时,您需要在save
之前add
是正确的。
不过,您不需要进行反向查找,add
可以接受许多对象,而不仅仅是documentation
listing.save()
listing.category.add(*form.cleaned_data["category"])
对于ModelForm,可以使用它,因为您正试图获取一个表单来创建模型。如果这是一种自定义表单,则可以执行其他操作,则需要使用forms.Form