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
4 Réponses :
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é.
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
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]?
J'ai découpé les parties non importantes, j'incrémente la boucle. bon oeil cependant, merci :)
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.
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
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