Django和HTML:要解压缩的值太多(预期为2个)

2024-09-30 01:29:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我是django和html的新手,我必须为学校做一个项目。我试图学习窗体如何与django一起工作,我想我把django窗体弄对了。但我只是不知道如何使它与我的html一起工作。 我得到了too many values to unpack (expected 2)。 以下是我表格的重要部分:

class ConfiguratorForm(forms.Form):
  queryOfProject = TypeOfProgram.objects.values_list('name')
  queryOfFramework = Framework.objects.values_list('name','version')
  listFramework = []
  listProject = []
  listFramework=[(q[0],q[1])for q in queryOfFramework]
  listProject =[(q[0])for q in queryOfProject]

  print("list of")
  print(listFramework)
  print(listProject)
  typeOfTheproject = forms.ChoiceField(choices = listProject)
  wantedFramework = forms.MultipleChoiceField(choices = listFramework)

其中listProjectlistFramework都是包含元素的列表。 我知道这不是一个好代码,但我正在学习如何工作,我没有太多的时间

对于html代码。我完全不知道我到底写了什么。我找了这么多,试了很多我见过的东西

{% block content %}

   <form method="post">
      {% csrf_token %}
      {{form}}
      <input type="submit" value="Submit">
   </form>
{% endblock %}

如果有人能告诉我如何更正html文件或者我的表单是否有误

编辑:以下是完整跟踪、我的模型和视图:

型号:

class web(models.Model):
   typeOfWeb = models.CharField(max_length=50)
   def __str__(self):
   template = '{0.typeOfWeb}'
   return template.format(self)

class TypeOfProgram(models.Model):
    name = models.CharField(max_length=200)
    def __str__(self):
        template = '{0.name}'
        return template.format(self)
    def __iter__(self):
        return iter(self.name)

class Language(models.Model):
    name = models.CharField(max_length=200)
    version = models.CharField(max_length=200)
    def __str__(self):
        template = '{0.name} {0.version}'
        return template.format(self)

class Pro(models.Model):
    advantage = models.CharField(max_length=200)
    def __str__(self):
        template = '{0.advantage}'
        return template.format(self)

class Con(models.Model):
    disadvantage = models.CharField(max_length=200)
    def __str__(self):
        template = '{0.disadvantage}'
        return template.format(self)

class Framework(models.Model):
    name = models.CharField(max_length=200)
    language = models.ManyToManyField(Language)
    version = models.CharField(max_length=20)
    typeOfFramework = models.ForeignKey(TypeOfProgram, on_delete=models.CASCADE)
    cotationOfFramework = models.IntegerField(default = 5) #need to increase from pros and cons
    pros = models.ManyToManyField(Pro)
    cons = models.ManyToManyField(Con)
    additionalInformation =  models.ForeignKey(web,blank=True,null=True ,default = None ,on_delete=models.CASCADE)
    def __str__(self):
        template = '{0.name} {0.version} {0.typeOfFramework} {0.cotationOfFramework} {0.additionalInformation}'
        return template.format(self)

    def __iter__(self):
        return [ self.name, 
                 self.language,
                 self.version, 
                 self.typeOfFramework, 
                 self.cotationOfFramework, 
                 self.pros, 
                 self.cons, 
                 self.additionalInformation]

视图:

    def index(request):
        context = {}
        context['form'] = ConfiguratorForm()
        return render(request, "forms/configurator.html", context)
        """all the configurator algorithm"""
        if request.method == 'POST':

               form = ConfiguratorForm(request.POST)

            #Check if the form is valid:
            if form.is_valid():
                typeOfProject = form.cleaned_data['typeOfTheproject']
                wantedFramework = form.cleaned_data['wantedFramework']
                listOfmember = form.cleaned_data['listOfmember']
                print(typeOfProject, wantedFramework, listOfmember)
#if the project is a web application, then 2 kind of framework are needed
            #need to parse instances of the form
            #get the database

            listOfProject = TypeOfProgram.objects.all()
            listOfFramework = Framework.objects.all()
            listOfLanguages = Language.objects.all()

            easiestChoice = ""
            bestChoice = ""
            otherChoices = [""]

            if typeOfproject == 'Web Application':
                typeOfproject = ["Backend", "Frontend"]
            else:
                print("hello world")
            neededFramework = []

            #take all the needed framework asked by the team
            for i in range(len(wantedFramework)):
                neededFramework.append(wantedFramework[i])

            #configure easiest choice
            #for all type of the project (needed for web development)
            for i in range(len(typeOfproject)):

                #for all asked framework
                for j in neededFramework:

                    #for all framework
                    for k in Framework.objects.value_list("name"):

                        #check if k is a good framework for the project
                        for l in typeOfproject:
                            currentFramework = Framework.objects.filter(name=k)
                            if l == currentFramework.typeOfFramework:

                                #verify they are the same
                                if k == i:
                                    if easiestChoice == "":
                                        easiestChoice = i
                                    #check the cotation
                                    else:
                                        check = Framework.objects.filter(name = i)
                                        check2 = Framework.objects.filter(name = easiestChoice)

                                        if check.cotationOfFramework > check2.cotationOfFramework:
                                            easiestChoice = i

            #configure best choice
            for i in range(len(typeOfproject)):
                for j in listOfFramework:
                    for l in typeOfproject:
                            currentFramework = Framework.objects.filter(name=j)
                            if l == currentFramework.typeOfFramework:
                                if bestChoice =="":
                                    bestChoice = j
                                else:
                                    check = Framework.objects.filter(name = bestChoice)
                                    if j.cotation > check.cotation:
                                        bestChoice = j.name

            #give all other choices

            for i in range(len(typeOfproject)):
                for j in listOfFramework:
                    for l in typeOfproject:
                            currentFramework = Framework.objects.filter(name=j)
                            if l == currentFramework.typeOfFramework:
                                otherChoices.append(j.name)






            return render(request, 'forms/configurator.html')

    return render(request, 'forms/configurator.html')

跟踪:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/configurator/

Django Version: 3.0
Python Version: 3.7.2
Installed Applications:
['configurator.apps.ConfiguratorConfig',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Template error:
In template C:\Users\victo\OneDrive\Documents\BAC 3\Projet Individuel\1920_INFOB318_CPDI\code\ProjetIndividuel\CPDI\configurator\templates\forms\configurator.html, error at line 5
   too many values to unpack (expected 2)
   1 : {% block content %}
   2 : 
   3 : <form method="post">
   4 :     {% csrf_token %}
   5 :      {{ form }} 
   6 :     <input type="submit" value="Submit">
   7 : </form>
   8 : {% endblock %}

Traceback (most recent call last):
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\victo\OneDrive\Documents\BAC 3\Projet Individuel\1920_INFOB318_CPDI\code\ProjetIndividuel\CPDI\configurator\views.py", line 18, in index
    return render(request, "forms/configurator.html", context)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\shortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\template\loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\template\base.py", line 171, in render
    return self._render(context)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\template\base.py", line 163, in _render
    return self.nodelist.render(context)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\template\base.py", line 936, in render
    bit = node.render_annotated(context)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\template\base.py", line 903, in render_annotated
    return self.render(context)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\template\loader_tags.py", line 53, in render
    result = self.nodelist.render(context)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\template\base.py", line 936, in render
    bit = node.render_annotated(context)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\template\base.py", line 903, in render_annotated
    return self.render(context)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\template\base.py", line 992, in render
    return render_value_in_context(output, context)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\template\base.py", line 971, in render_value_in_context
    value = str(value)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\utils\html.py", line 373, in <lambda>
    klass.__str__ = lambda self: mark_safe(klass_str(self))
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\forms\forms.py", line 137, in __str__
    return self.as_table()
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\forms\forms.py", line 279, in as_table
    errors_on_separate_row=False,
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\forms\forms.py", line 238, in _html_output
    'field_name': bf.html_name,
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\utils\html.py", line 373, in <lambda>
    klass.__str__ = lambda self: mark_safe(klass_str(self))
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\forms\boundfield.py", line 33, in __str__
    return self.as_widget()
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\forms\boundfield.py", line 89, in as_widget
    attrs = self.build_widget_attrs(attrs, widget)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\forms\boundfield.py", line 224, in build_widget_attrs
    if widget.use_required_attribute(self.initial) and self.field.required and self.form.use_required_attribute:
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\forms\widgets.py", line 702, in use_required_attribute
    return use_required_attribute and first_choice is not None and self._choice_has_empty_value(first_choice)
  File "C:\Users\victo\OneDrive\Documents\Django\ProjetIndividuel\env\lib\site-packages\django\forms\widgets.py", line 688, in _choice_has_empty_value
    value, _ = choice

Exception Type: ValueError at /configurator/
Exception Value: too many values to unpack (expected 2)

Tags: djangoinpyselfenvlinetemplateonedrive
1条回答
网友
1楼 · 发布于 2024-09-30 01:29:02

你的代码是有线的

选择字段期望获得元组或列表类型:key-value

要修复too many values to unpack (expected 2),请在表单中更改以下行:

typeOfTheproject = forms.ChoiceField(choices = listProject)
wantedFramework = forms.MultipleChoiceField(choices = listFramework)

用于:

第一版本代码:

class ConfiguratorForm(forms.Form):
    queryOfProject = TypeOfProgram.objects.values_list('name')
    queryOfFramework = Framework.objects.values_list('name', 'version')
    listOfProject = []
    listOfFramework = []
    listOfFramework += queryOfFramework
    listOfProject += queryOfProject
    listFramework = []
    listProject = []

    for i in range(0,len(listOfFramework)):
       listFramework.append(listOfFramework[i]['name'] + " " +listOfFramework[i]['version'])
    for i in range(0,len(listOfProject)):
       listProject.append(listOfProject[i]['name'])

    typeOfTheproject = forms.ChoiceField(choices=[(x, x) for x in listProject])  # < -
    wantedFramework = forms.MultipleChoiceField(choices=[(x, x) for x in listFramework])  # < -

第二版本代码:

class ConfiguratorForm(forms.Form):
    queryOfProject = TypeOfProgram.objects.values_list('name')
    queryOfFramework = Framework.objects.values_list('name','version')
    listFramework = []
    listProject = []
    listFramework=[(q['name'], q['version'])for q in queryOfFramework]    # < -
    listProject =[(q['name'])for q in queryOfProject]    # < -

    print("list of")
    print(listFramework)
    print(listProject)
    typeOfTheproject = forms.ChoiceField(choices = listProject)
    wantedFramework = forms.MultipleChoiceField(choices = listFramework)

相关问题 更多 >

    热门问题