J'ai une forme dans laquelle un utilisateur peut soumettre du texte, qui est enregistré sur le modèle Toutefois, il ne fait que sauve que lorsque je supporte si je quitte Quelqu'un peut-il m'aider à comprendre pourquoi il s'agit et comment obtenir le texte à enregistrer avec l'utilisateur? P > modèles.py p> formulaires.py p> vues.py p> profil.html p> Textsubmission code>.
instance = Demande. Utilisateur code> à partir de
vues.py code> et il n'a pas enregistré avec l'instance de l'utilisateur qui l'a soumis. p>
instance = requête.utilisateur < / Code> Dans, la requête
.post code> n'est pas sauvegardée mais obtient posté. (Je peux voir de
print (demande.post) code> p>
3 Réponses :
L'instance nécessite l'instance du modèle référencé dans la définition de formulaire. Dans votre cas, il est même cas Pour Textsubmission code>, vous avez donc d'abord obtenir un objet de ce modèle, puis transmettez-le au
TextsubmissionForm code>
userUpDateform code> p> p>
Je ne comprends pas pourquoi userupdateform code> fonctionne bien?
Vous passez le formulaire Textsubmission une instance de l'utilisateur lorsque vous souhaitez vous transmettre une instance de Textsubmission. Essayez
Lorsque je le fais, j'obtiens likeeObjectDoesNotexist utilisateur n'a pas de textusubmission. Code> Je suppose que cela se produit car
utilisateur code> est un
oneoonefield code> dans
Textsubmission < / code>
Vous devez d'abord vérifier s'il existe, puis en fonction du résultat le transmet ou non. Cela déterminera si le formulaire crée l'objet ou met à jour l'existant. Vous pouvez envelopper l'appel ci-dessus dans un essayer ... sauf code>
Merci Dirk, je n'ai plus d'erreur, mais l'instance utilisateur ne sauve toujours pas avec le Textsubmission code>, seulement le texte
@Dirkgroten i obtient likeeObjectDoesNotexist Utilisateur n'a pas de textusubmission. Code> Parce que l'objet texte n'existe évidemment pas encore sur le premier chargement de la page, mais comment se fait que le
p_form code> ne jette pas Toute erreur (comme il n'a pas encore de données?)
Il suffit de réaliser que c'est parce que j'ai un signal pour créer un profil à chaque fois qu'un nouvel utilisateur est effectué.
@Trilla où obtenez-vous likeeObjectDoesNotexist code>? Si vous essayez, sauf comme indiqué, vous attrapez cela. Donc, il doit être ailleurs ailleurs que vous essayez d'accéder à
user.textsubmission code>.
Quel devrait être le bloc sinon code>? Je l'ai en ce moment comme
t_form = textsubmissionForm (instance = demande.user.textsubmission) code> qui cause le problème
remplacer le Puis, sous vos vues, P> __ init __ () code> strong> méthode et
Enregistrer () code> strong> méthode du formulaire comme
def profile_view(request):
if request.method == 'POST':
u_form = UserUpdateForm(request.POST) # change is here
t_form = TextSubmissionForm(request.POST, user=request.user) # change is here
if u_form.is_valid() and t_form.is_valid():
u_form.save()
t_form.save()
messages.success(request, f'Your account has been updated!')
return redirect('profile')
else:
u_form = UserUpdateForm() # change is here
t_form = TextSubmissionForm() # change is here
context = {
'u_form': u_form,
't_form': t_form,
}
return render(request, 'profile.html', context)
Ce serait correct si la création d'un nouvel utilisateur, mais je pense que l'OP est la mise à jour des enregistrements existants, de transmettre l'instance code> sur le formulaire de modèle est toujours requise. Pas sûr de
Textsubmission code> cependant, je m'attendrais à ce que cela soit soit à la mise à jour (s'il existe déjà) ou de créer.
Oui @DirkGroten Pour le moment, la Textsubmission est un peu drôle, c'est à côté du profil de mise à jour pour l'instant, mais oui avec le célibataire demande.post code> Je mettez à jour les enregistrements existants et que vous soumettez également de nouveaux
Textsubmissions Code>
L'instance doit être une instance du modèle utilisé par le formulaire. Vous ne pouvez pas passer un
instance code> à votre
TextsubmissionForm code> car l'instance doit être un
Textsubmission code>.
Mais qu'en est-il du moment où un nouveau profil utilisateur est créé et n'a pas encore d'instance d'un
textsubmission code> associé à elle? Qui jette le
likeeObjectDOsNotexist code>
C'est pourquoi vous devriez avoir
sauf textsubmission.doesnotexist: ... code>, donc l'exception n'est donc pas lancée mais manipulée. c'est à dire. Vous devez également essayer. Sauf dans votre bloc d'autre.
Merci pour votre aide, je comprends pourquoi cela est nécessaire maintenant. Le
request.post code> ne sauve toujours pas avec l'instance de l'utilisateur ... il ne fait que sauver le texte.
Pour un nouveau, vous voulez dire? C'est parce que votre formulaire n'a que le champ "text_submission" de sorte qu'il n'associe pas à un utilisateur au texte. En fait, je m'attendrais à ce que votre code planche car
utilisateur code> est obligatoire dans votre modèle. Normalement, pour cela, vous feriez quelque chose comme:
soumission = t_form.save (commit = faux); soumission.user = demande.user; soumission.Save () code>. Ou adaptez votre formulaire comme indiqué dans la réponse par @jpg pour transmettre également l'utilisateur, ce qui est une meilleure séparation des préoccupations (le formulaire enregistre l'instance).
Je vous remercie beaucoup.