Dans Django, comment puis-je pré-remplir un formulaire d'édition d'un modèle/enfant, mais de sauver la soumission comme une nouvelle instance?
Je suis en train de préremplir un ModelForm et un inlineformset_factory avec une instance d'un Modèle, MAIS lorsque l'utilisateur soumet le formulaire, j'ai besoin de créer une nouvelle instance du Modèle et c'est un enfant dans des dossiers.
Exemple De Modèle:
class Artist(models.Model):
artist = models.CharField(max_length=100)
class Song(models.Model):
artist = models.ForeignKey(Artist)
song = models.CharField(max_length=200)
Je veux que l'utilisateur puisse voir d'un formulaire d'édition basée sur une instance de l'Artiste, avec une InlineFormSet pour que l'Artiste liées Chansons. Le formulaire sera pré-remplis avec les données existantes et l'utilisateur peut modifier le nom de l'artiste et de la chanson des noms. Toutefois, lorsque l'utilisateur soumet le formulaire, je ne veux pas écraser les enregistrements existants. Au lieu de cela, je veux créer une nouvelle instance de l'Artiste et d'ajouter de nouvelles Chansons de ce nouvel artiste.
J'ai essayé le réglage de la clé primaire de l'artiste à Aucun avant d'enregistrer - et cela force une nouvelle instance de l'Artiste. Cependant, je perds le ForeignKey relation entre les Artistes et les Chansons.
Exemple:
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})
OriginalL'auteur | 2009-04-26
Vous devez vous connecter pour publier un commentaire.
Vous pouvez effectuer une itération sur les formes individuelles dans votre formset, changer ce que vous en avez besoin et enregistrer.
Je vais donner la réponse et de poster une question sur inlineformsets une fois que j'ai du travail par ce biais. Merci encore.
mais cela signifie que votre modèle de la chanson est valable sans artiste qui est un peu bizarre...
OriginalL'auteur Harold
Je pense que la meilleure façon de le faire serait de définir des valeurs par défaut par le passage d'un dictionnaire en tant que premier argument de la forme. Vous pouvez obtenir toutes d'une instance du modèle de champs par:
C'est le dictionnaire que vous avais passer dans la forme.
Si vous avez exclus de tout, de la forme, vous pouvez le supprimer à partir du dictionnaire. De même pour
id
. Mais cela doit produire un formulaire qui contient toutes les valeurs de l'instance existante, mais vous permettra d'économiser pour une nouvelle instance.OriginalL'auteur tghw
J'ai eu un problème similaire et je l'ai résolu comme ceci:
OriginalL'auteur Irfan
J'ai trouvé cet extrait qui était, je pense, plus ce que vous recherchez.
http://www.djangosnippets.org/snippets/1246/
OriginalL'auteur Justin Hamade