Я новичок в 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)
Где listProject
и listFramework
- оба списка, содержащие элементы. И я знаю, что это плохой код, но я изучаю, как все работает, и у меня мало времени.
Для кода 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)