我正在尝试使用模型的实例预填充 ModelForm 和 inlineformset_factory,但是当用户提交表单时,我需要创建模型的新实例及其相关的子记录。
示例模型:
class Artist(models.Model):
artist = models.CharField(max_length=100)
class Song(models.Model):
artist = models.ForeignKey(Artist)
song = models.CharField(max_length=200)
我希望用户看到基于 Artist 实例的编辑表单,以及该 Artist 相关歌曲的 InlineFormSet。该表格将预先填充现有数据,用户可以更改艺术家的姓名和歌曲名称。但是,当用户提交表单时,我不想覆盖现有记录。相反,我想创建一个新的 Artist 实例并为这个新艺术家添加新的歌曲。
在保存之前,我尝试将艺术家的主键设置为无 - 这会强制创建一个新的 Artist。但是,我失去了 Artists 和 Songs 之间的 ForeignKey 关系。
示例视图:
def edit(request, artist_id=None):
if artist_id == None:
artistsubmission = Artist()
else:
artistsubmission = Artist.objects.get(id = artist_id)
artistsubmission.pk = None
if request.method == 'POST':
form = ArtistEditForm(request.POST, instance=artistsubmission)
formset = SongFormSet(request.POST, instance=artistsubmission)
if form.is_valid() and formset.is_valid():
form.save()
formset.save()
return HttpResponseRedirect('/success/')
else:
form = ArtistEditForm(instance=artistsubmission)
formset = SongFormSet(instance=artistsubmission)
return render_to_response('edit.html', {'form':form, 'formset':formset})