django - No Django, como posso pré-preencher um formulário de edição de um modelo / criança, mas salvar a apresentação como nova instância? - CoreDump.pt
No Django, como posso pré-preencher um formulário de edição de um modelo / criança, mas salvar a apresentação como nova instância?
Eu estou tentando preencher previamente um ModelForm e um inlineformset_factory com uma instância de um modelo, mas quando o usuário envia o formulário, eu preciso criar uma nova instância do modelo e ele está relacionado registros filho.
artist = models.ForeignKey(Artist)
song = models.CharField(max_length=200)
Eu quero o usuário para ver um formulário de edição com base em uma instância do artista, juntamente com um InlineFormSet para músicas relacionadas desse artista. O formulário será preenchido com os dados existentes eo usuário pode alterar o nome do artista e os nomes das músicas. No entanto, quando o usuário envia o formulário, eu não deseja substituir os registros existentes. Em vez disso, eu quero criar uma nova instância do artista e adicionar novas músicas para este novo artista.
Tenho experimentado definindo a chave primária do artista para Nenhum antes de salvar - e isso força uma nova instância do artista. No entanto, eu perco a relação ForeignKey entre artistas e músicas.
Exemplo Ver:
def edit(request, artist_id=None):
if  artist_id == None:
artistsubmission = Artist()
artistsubmission = Artist.objects.get(id = artist_id)
artistsubmission.pk = None
form = ArtistEditForm(request.POST, instance=artistsubmission)
formset = SongFormSet(request.POST, instance=artistsubmission)
form = ArtistEditForm(instance=artistsubmission)
formset = SongFormSet(instance=artistsubmission)
return render_to_response('edit.html', {'form':form, 'formset':formset})
djangodjango-modelsdjango-forms
Publicado 26/04/2009 em 03:10 2009-04-26 03:10
fonte usuário user90419
Você pode iterar sobre as formas individuais em seu formset, altere o que você precisa e salvar.
artist = form.save()
for f in formset.forms:
song = f.save(commit=False)
song.artist = artist.id
Respondeu 26/04/2009 em 07:24 2009-04-26 07:24 share
Eu acho que a maneira mais fácil de fazer isso seria para definir valores padrão por meio de um dicionário em como o primeiro argumento para o formulário. Você pode obter todos os campos da instância de um modelo por
d_initial = Artist.objects.filter(pk=artist_id).values()[0]
Este é o dicionário que você iria passar para o formulário.
form = ArtistEditForm(d_initial)
Se tiver excluído qualquer coisa, desde a forma, você pode querer removê-lo do dicionário. Mesmo para id. Mas isso deve produzir uma forma que tem todos os valores da instância existente, mas irá poupar para uma nova instância.
Respondeu 26/04/2009 em 06:55 2009-04-26 06:55 share
Eu tive um problema semelhante e eu resolvi-lo assim:
if artist_id == None:
artistsubmission = get_object_or_404(Artist, id = artist_id)
artist = form.save(commit=False)
artist.id = None
song.id = None
Respondeu 14/07/2009 em 11:23 2009-07-14 11:23 share
fonte usuário Irfan
Eu encontrei este trecho que eu acho que foi mais o que você estava procurando. http://www.djangosnippets.org/snippets/1246/