Django不是ModelMultipleChoiceField

时间:2018-01-20 10:00:50

标签: python django forms

我创建了一个由世界上所有国家/地区的两个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正在做我想要它做的事情(传递两个国家的名字,以便它可以比较大小)但它告诉我表格无效。我该如何解决这个问题?在此先感谢您的帮助,非常感谢!

2 个答案:

答案 0 :(得分:0)

我的两分钱(尚未测试):1。删除.values_list('name',flat=True)

country_1 = forms.ModelMultipleChoiceField(
    queryset=WorldBorder.objects.all()
)
country_2 = forms.ModelMultipleChoiceField(
    queryset=WorldBorder.objects.all()
)
  1. __str__()模型指定__unicode__()WorldBorder

答案 1 :(得分:0)

从我得到的答案中学习(非常感谢你们!),这就是我解决它的方法:

  1. 无需再次将表单的POST定义为结果。
  2. 由于ComparisonForm中的数据直接来自db,我可以使用POST中表单中的ID从数据库中提取国家/地区。在查询数据库时无需使用实际的国家/地区名称。
  3. 所以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)
    

    如上所述。