0
votes

Django - Publier les données non au format form.cleaned_data conduisant à une erreur clé

J'ai un formulaire créé dynamiquement avec Django. Lorsque ce formulaire est soumis, je peux voir toutes les données dans request.post, cela étant dit lorsque j'accède à form.cleaned_data, l'une des entrées n'est pas là. Cela provoque une KeyError lorsque j'essaye d'y accéder.

Il n'y a pas d'erreurs causées par le formulaire et le formulaire semble valide. Si quelqu'un a d'autres avenues que je pourrais rechercher, je serais très reconnaissant.

Voici l'erreur:

class StrategicBriefForm(forms.Form):

    def __init__(self, *args, **kwargs):

        questions = kwargs.pop("Questions", None)
        super(StrategicBriefForm, self).__init__(*args, **kwargs)
        if questions:
            i = 0
            while i < len(questions):
                question = questions[i].Question

                if question['DropdownList'] == True:
                    self.fields['DropdownList_%s' % i] = forms.CharField(label=question['DropdownList_Question']['context'],
                                                                  required=False)

                i = i + 1

Voici la vue bien que je ne le fasse pas Je ne pense pas que cela vous aidera:

def post(self, request):
    if request.method == 'POST':
        files = Files.objects.get(FileName="Strategic Brief")
        self.request.session['activeFile'] = files.id
        form = OutlineBusinessCaseForm(request.POST, request.FILES, Questions=files.questions.all())
        activeproject = request.session['activeProject']

        print(form.errors)
        if form.is_valid():

            current_user = self.request.user
            projects = userProject.objects.filter(id=activeproject, UserID=current_user)
            file = Files.objects.get(FileName="Strategic Brief")
            questions = file.questions.all()
            awnseredQuestion = QuestionAwner(UserID=self.request.user, ProjectID=projects[0].ProjectID, FileID=file)

            a = 0
            while a < len(questions):
                awnseredQuestion = QuestionAwner(UserID=self.request.user, ProjectID=projects[0].ProjectID,
                                                 FileID=file)
                awnser = '{"Title": "' + questions[a].Question['Title'] + '",' + '"AwnserTitle": "' + \
                         questions[a].Question['AwnserTitle'] + '",'



                if questions[a].Question['DropdownList'] == True:
                    ThisQuestion = questions[a].Question['DropdownList_Question']
                    ThisAwnser = str(form.cleaned_data[str('DropdownList_' + str(a))])

Voici le formulaire:

Internal Server Error: /gluiq/StrategicBrief/
Traceback (most recent call last):
  File "/Users/matthew/python3venv/gluiq/lib/python3.7/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/Users/matthew/python3venv/gluiq/lib/python3.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/matthew/python3venv/gluiq/lib/python3.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/matthew/python3venv/gluiq/lib/python3.7/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/matthew/python3venv/gluiq/lib/python3.7/site-packages/braces/views/_access.py", line 102, in dispatch
    request, *args, **kwargs)
  File "/Users/matthew/python3venv/gluiq/lib/python3.7/site-packages/django/views/generic/base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "/Users/matthew/PycharmProjects/GluIQ/DreamIt/views.py", line 494, in post
    ThisAwnser = str(form.cleaned_data[str('DropdownList_' + str(a))])
KeyError: 'DropdownList_6'
[09/Apr/2019 12:25:51] "POST /gluiq/StrategicBrief/ HTTP/1.1" 500 97452


6 commentaires

Vous devez afficher le code de votre formulaire et afficher.


J'ai cependant édité les questions, je ne sais pas si voir la vue ne ferait que semer la confusion \


Vous devez toujours afficher le modèle et le code django de votre vue


Veuillez apprendre à écrire pour les boucles. Utiliser un certain temps et un compteur n'est vraiment pas la bonne chose à faire.


@ ger.s.brett mon modèle est de 1000 lignes, je ne pense pas que je publie cela vous aidera. Cela étant dit, les données de publication renvoyées au serveur contiennent DropdownList_6 qui a été créée avec le formulaire ci-dessus.


@DanielRoseman oui je devrais mais alors que les boucles sont plus jolies: D


4 Réponses :


0
votes

Vous devez toujours renvoyer la collection de données nettoyées. Vous avez probablement oublié de renvoyer cleaning_data dans votre méthode de nettoyage afin que self.cleaned_data ne soit pas renseigné.


1 commentaires

clean_data est rempli avec de nombreuses autres entrées qui ont été supprimées du code pour une visualisation plus facile. Ce formulaire a 32 entrées et cette DropdownList_6 est la seule qui ne soit pas dans clean_data



0
votes

Où incrémentez-vous "a"? peut-être que votre boucle while est en cours d'exécution pour toujours et que vous obtenez une erreur clé lorsque vous êtes à court de questions. Etes-vous sûr que dans votre exemple il y avait une vraie question [6]?


1 commentaires

J'ai découpé les parties non importantes, j'incrémente la boucle. bon oeil cependant, merci :)



0
votes

J'ai fini par réutiliser le code, j'ai oublié le changement de nom du formulaire que j'appelais. J'aurais dû appeler StrategicBriefForm dans la vue au lieu de OutlineBusinessCaseForm.

Merci à tous ceux qui ont essayé de vous aider.


0 commentaires

0
votes

lorsque j'utilise cette impression (self.request.user), il doit imprimer l'utilisateur actuel mais ne peut pas modifier l'utilisateur avec la table dans le panneau d'administration.

shrt = form.save(commit=False)
shrt.user = request.user
        shrt.save()
        form.save()

son travail avec succès. essayez cette commande


0 commentaires