2017-07-10 5 views
0

Ich versuche, Formulardaten über POST-Methode zu bekommen, aber bekam "Kontext muss ein Diktat sein, anstatt Tupel" error.Ich habe es viel Google, nach dem Django 1.11 ' s docs Wir brauchen nur ein normales Wörterbuch anstelle einer Context-Instanz. Ich bin hier fest, hilf mir bitte!Kontext muss ein Diktat sein, anstatt Tupel Django Formen

Hier ist der Fehler:

TypeError at /docker/auth/ 
context must be a dict rather than tuple. 
Request Method: POST 
Request URL: http://127.0.0.1:8000/docker/auth/ 
Django Version: 1.11.3 
Exception Type: TypeError 
Exception Value:  
context must be a dict rather than tuple. 
Exception Location: /Users/abdul/IstioVirEnv/lib/python3.6/site-packages/django/template/context.py in make_context, line 287 
Python Executable: /Users/abdul/IstioVirEnv/bin/python 
Python Version: 3.6.1 
Python Path:  
['/Users/abdul/Documents/IGui', 
'/Users/abdul/IstioVirEnv/lib/python36.zip', 
'/Users/abdul/IstioVirEnv/lib/python3.6', 
'/Users/abdul/IstioVirEnv/lib/python3.6/lib-dynload', 
'/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', 
'/Users/abdul/IstioVirEnv/lib/python3.6/site-packages'] 
Server time: Mon, 10 Jul 2017 10:12:30 +0000 

Hier Mein views.py ist:

import json 

from django.shortcuts import render 
from django.views.generic import CreateView 
from . import forms 
from django.http import HttpResponse 

class DockerAuth(CreateView): 
    form_class = forms.DockerAuthForm 

    def get(self, request, *args, **kwargs): 
     return render(request, 'dockerDep/docker_login.html', {}) 

    def post(self, request, *args, **kwargs): 
     lform = forms.DockerAuthForm(request.POST) 
     if lform.is_valid(): 
      data = lform.cleaned_data 
      name = data['docker_name'] 
      password = data['docker_pass'] 
      args = { 
       "mname": name, 
       "mpass": password 
      } 
     return render(request, 'dockerDep/response.html', args) 

Hier ist mein forms.py:

from django.forms import forms 
from .import models 

class DockerAuthForm(forms.Form): 
    class Meta: 
     fields = ('docker_name', 'docker_pass') 
     model = models.DockerAuth 

Hier ist meine models.py:

from django.db import models 

class DockerAuth(models.Model): 
    docker_name = models.CharField(max_length=255) 
    docker_pass = models.CharField(max_length=255) 

Hier ist mein HTML-Template:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>DOCKER</title> 
</head> 
<body> 
    <form method="post" action=""> 
     {% csrf_token %} 
     <input type="text" name="docker_name" title="Name"> 
     <input type="password" name="docker_pass" title="Password"> 
     <input type="submit" value="Submit"/> 
    </form> 
</body> 
</html> 
+1

zu vermeiden Wenn Sie eine Fehlermeldung erhalten, ** post it ** zusammen mit dem vollständigen Zurückverfolgungs. –

Antwort

5

Werfen Sie einen Blick auf:

def post(self, request, *args, **kwargs): 
    lform = forms.DockerAuthForm(request.POST) 
    if lform.is_valid(): 
     data = lform.cleaned_data() 
     name = data['docker_name'] 
     password = data['docker_pass'] 
     args = { 
      "mname": name, 
      "mpass": password 
     } 
    return render(request, 'dockerDep/response.html', args) 

Sie fangen args als Parameter in dieser Zeile:

def post(self, request, *args, **kwargs): 

Und ein * bedeutet, dass es ein Tupel. Danach wird args ein Tupel sein. Also, wenn Sie in lform.is_valid() nicht args ändern (scenarion wo Form nicht gültig ist), wird es Tupel bleiben und zu render()

EDIT

definieren ‚default‘ context (es wird weitergegeben werden leer)

ändern args Name für context Kollisionen

def post(self, request, *args, **kwargs): 
    lform = forms.DockerAuthForm(request.POST) 
    context = {} 
    if lform.is_valid(): 
     data = lform.cleaned_data() 
     name = data['docker_name'] 
     password = data['docker_pass'] 
     context = { 
      "mname": name, 
      "mpass": password 
     } 
    return render(request, 'dockerDep/response.html', context) 
+0

Ich konnte nicht verstehen, was du sagst, ist da etwas falsch in meiner Sicht? –

+0

@AbdulRehman einfach gesagt, verwenden Sie 'kwargs' anstatt dann' args' –

+0

@The_Cthulhu_Kid, meinst du das: 'Def Post (selbst, Anfrage, Args, Kwargs):'. ? –

Verwandte Themen