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 の主キーを None に設定しようとしました。これにより、Artist の新しいインスタンスが強制的に作成されます。ただし、アーティストと曲の間の 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})