我有一个用户可以上传文件的表单。上传后,每个文件立即保存到db,并将每个文件的id存储在表单上的隐藏字段中。提交表单时,视图将提取ID并尝试创建每个文件与表单对象(服务器场)之间的关系。虽然id到达了视图,但是关系没有保存,我不明白为什么 - 请帮忙。
class File(models.Model):
name = models.CharField(max_length=200, null=True, blank=True)
event = models.ForeignKey('Event', related_name='files', null=True, blank=True, on_delete=models.SET_NULL)
farm = models.ForeignKey('Farm', related_name='files', null=True, blank=True, on_delete=models.SET_NULL)
class Farm(models.Model):
name = models.CharField(max_length=200, null=True, blank=True)
class FarmCreateView(CreateView):
template_name = 'directory/farm_registration.html'
model = Farm
def post(self, request, *args, **kwargs):
farm_form = FarmForm(self.request.POST)
if farm_form.is_valid():
new_farm = farm_form.save(commit=False)
image_upload_ids = self.request.POST.get('_file_ids_photos')
# confirmed using print that the image ids are added here
if image_upload_ids:
image_upload_ids = image_upload_ids.split(',')
for image in filter(None, image_upload_ids):
image_file = File.objects.get(id=image)
#confirmed using print that the image_file object is retrieved from the db
new_farm.files.add(image_file)
print('Files count', new_farm.files.count())
# above line prints 0, even though files are added in the loop above
new_farm.save()
答案 0 :(得分:1)
new_farm
尚未保存,因此它没有主键。其他项目与它有关,直到它有一个 - 它们会在FK字段中放入什么?
你根本不需要commit=False
。只需在is_valid
块的开头保存它;没有必要在最后再次保存它,因为您还没有更改Farm对象,您只更改了文件。
(我想知道这里的FK关系是否正确。这是一对多的,所以你得到现有的文件,并将他们所指向的任何农场更改为新的。这真的是你的意思吗?想做什么?我怀疑多对多的关系会更好,所以文件可以指向多个农场。)