我创建了一个由世界上所有国家/地区的两个ModelMultipleChoiceField组成的表单。
但是在POST请求之后,Django并不认为该表单有效且错误:
"阿尔及利亚"不是主键的有效值
(或我选择的任何国家/地区)。这是我的表格:
class ComparisonForm(forms.Form):
country_1 = forms.ModelMultipleChoiceField(
queryset=WorldBorder.objects.values_list('name',flat=True)
)
country_2 = forms.ModelMultipleChoiceField(
queryset=WorldBorder.objects.values_list('name',flat=True)
)
国家/地区列表来自数据库,工作正常。我的意见:
def lookup(request):
if request.method == "POST":
form = ComparisonForm(request.POST)
if form.is_valid():
results = form.save(commit=False)
country_1 = WorldBorder.objects.get(name=results.country_1)
country_2 = WorldBorder.objects.get(name=results.country_2)
country_1_name = country_1.name
country_2_name = country_2.name
multiplier = round(country_2.area / country_1.area, 1)
return render(
request, 'results.html', {
'country_1': dummy,
'country_1': country_1_name,
'country_2': country_2_name,
'multiplier': multiplier,
}
)
else:
return render(request, 'error.html', {'form': form})
else:
form = ComparisonForm()
return render(
request, 'lookup.html', {'form': form}
)
最后属于表单的html:
{% extends "base.html" %}
{% block content %}
<h2>Compare the size of two countries here:</h2>
<form id="comparison" action="" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" name="compare" value="Go compare!">
</form>
{% endblock %}
我对Django很陌生,对于如何解决这个问题有点不知所措。
从我看到的地方,Django正在做我想要它做的事情(传递两个国家的名字,以便它可以比较大小)但它告诉我表格无效。我该如何解决这个问题?在此先感谢您的帮助,非常感谢!
答案 0 :(得分:0)
我的两分钱(尚未测试):1。删除.values_list('name',flat=True)
country_1 = forms.ModelMultipleChoiceField(
queryset=WorldBorder.objects.all()
)
country_2 = forms.ModelMultipleChoiceField(
queryset=WorldBorder.objects.all()
)
__str__()
模型指定__unicode__()
或WorldBorder
。答案 1 :(得分:0)
从我得到的答案中学习(非常感谢你们!),这就是我解决它的方法:
所以views.py成为:
def lookup(request):
if request.method == "POST":
form = ComparisonForm(request.POST)
if form.is_valid():
# pull country ids from POST and then GET objects from db
country_1_id = request.POST.get('country_1')
country_2_id = request.POST.get('country_2')
country_1_db = WorldBorder.objects.filter(id=country_1_id)
country_2_db = WorldBorder.objects.filter(id=country_2_id)
# pull country names and areas
country_1_name = country_1_db.values_list('name', flat=True)[0]
country_2_name = country_2_db.values_list('name', flat=True)[0]
country_1_area = country_1_db.values_list('area', flat=True)[0]
country_2_area = country_2_db.values_list('area', flat=True)[0]
multiplier = round(country_2_area / country_1_area, 1)
如上所述。