0
votes

Django 2 request.post ne pas enregistrer à la base de données avec instance = demande.user

J'ai une forme dans laquelle un utilisateur peut soumettre du texte, qui est enregistré sur le modèle Textsubmission .

Toutefois, il ne fait que sauve que lorsque je supporte instance = Demande. Utilisateur à partir de vues.py et il n'a pas enregistré avec l'instance de l'utilisateur qui l'a soumis.

si je quitte instance = requête.utilisateur < / Code> Dans, la requête .post n'est pas sauvegardée mais obtient posté. (Je peux voir de print (demande.post)

Quelqu'un peut-il m'aider à comprendre pourquoi il s'agit et comment obtenir le texte à enregistrer avec l'utilisateur?

modèles.py xxx

formulaires.py xxx

vues.py Xxx

profil.html xxx


6 commentaires

L'instance doit être une instance du modèle utilisé par le formulaire. Vous ne pouvez pas passer un instance à votre TextsubmissionForm car l'instance doit être un Textsubmission .


Mais qu'en est-il du moment où un nouveau profil utilisateur est créé et n'a pas encore d'instance d'un textsubmission associé à elle? Qui jette le likeeObjectDOsNotexist


C'est pourquoi vous devriez avoir sauf textsubmission.doesnotexist: ... , 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 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 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 () . 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.


3 Réponses :


-1
votes

L'instance nécessite l'instance du modèle référencé dans la définition de formulaire. Dans votre cas, il est Textsubmission , vous avez donc d'abord obtenir un objet de ce modèle, puis transmettez-le au TextsubmissionForm xxx

même cas Pour userUpDateform


1 commentaires

Je ne comprends pas pourquoi userupdateform fonctionne bien?



1
votes

Vous passez le formulaire Textsubmission une instance de l'utilisateur lorsque vous souhaitez vous transmettre une instance de Textsubmission. Essayez xxx


7 commentaires

Lorsque je le fais, j'obtiens likeeObjectDoesNotexist utilisateur n'a pas de textusubmission. Je suppose que cela se produit car utilisateur est un oneoonefield 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


Merci Dirk, je n'ai plus d'erreur, mais l'instance utilisateur ne sauve toujours pas avec le Textsubmission , seulement le texte


@Dirkgroten i obtient likeeObjectDoesNotexist Utilisateur n'a pas de textusubmission. 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 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 ? Si vous essayez, sauf comme indiqué, vous attrapez cela. Donc, il doit être ailleurs ailleurs que vous essayez d'accéder à user.textsubmission .


Quel devrait être le bloc sinon ? Je l'ai en ce moment comme t_form = textsubmissionForm (instance = demande.user.textsubmission) qui cause le problème



1
votes

remplacer le __ init __ () code> strong> méthode et Enregistrer () code> strong> méthode du formulaire comme xxx PRE>

Puis, sous vos vues, P>

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)


2 commentaires

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 sur le formulaire de modèle est toujours requise. Pas sûr de Textsubmission 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 Je mettez à jour les enregistrements existants et que vous soumettez également de nouveaux Textsubmissions