使用ModelMultipleChoiceField从表单中检索模型

时间:2010-04-12 19:48:00

标签: django django-forms

我对表单有困难,特别是ModelMultipleChoiceField。

我已经从各种示例拼凑了这些代码,但遗憾的是它不起作用。

我希望能够:

  1. 在work_search.html
  2. 上搜索一些作品
  3. 显示搜索结果,每个结果旁边都有复选框
  4. 通过复选框
  5. 选择我想要的作品
  6. 按“添加”后,显示已选择的作品。
  7. 我相信除了最后一部分,一切都还可以。该页面只显示“作品”:(

    这是代码 - 抱歉长度。

    Models.py

    class Work(models.Model):
        title = models.CharField(max_length=200)
        artist = models.CharField(max_length=200)
        writers = models.CharField(max_length=200)
    
        def __unicode__(self):
            return self.title + ' - ' + self.artist
    

    forms.py

    class WorkSelectForm(forms.Form):
        def __init__(self, queryset, *args, **kwargs):
            super(WorkSelectForm, self).__init__(*args, **kwargs)
            self.fields['works'] = forms.ModelMultipleChoiceField(queryset=queryset,       widget=forms.CheckboxSelectMultiple())
    

    views.py

    def work_search(request):
        query = request.GET.get('q', '')
        if query:
            qset = (
                Q(title__icontains=query) |
                Q(artist__icontains=query) |
                Q(writers__icontains=query)
            )
            results = Work.objects.filter(qset).distinct()
            form = WorkSelectForm(results)
            return render_to_response("work_search.html", {"form": form, "query": query })    
        else:
            results = []
        return render_to_response("work_search.html", {"query": query })
    
    def add_works(request):
        #if request.method == POST:
        form = WorkSelectForm(request.POST)
        #if form.isvalid():
        items = form.fields['works'].queryset
        return render_to_response("add_works.html", {"items":items})
    

    work_search.html

    {% extends "base.html" %}
    {% block content %}
      <h1>Search</h1>
      <form action="." method="GET">
        <label for="q">Search: </label>
        <input type="text" name="q" value="{{ query|escape }}">
        <input type="submit" value="Search">
      </form>
    
      {% if query %}
        <h2>Results for "{{ query|escape }}":</h2>
        <form action="add_works" method="post">
            <ul>
            {% if form %}
                {{ form.as_ul }}
            {% endif %}
            </ul>
            <input type="submit" value="Add">
        </form>
      {% endif %}
    {% endblock %}
    

    add_works.html

    {% extends "base.html" %}
    {% block content %}
        {% if items %}
            {% for item in items %}
                {{ item }}
            {% endfor %}
        {% else %}
            <p>Nothing selected</p>
        {% endif %}
    {% endblock %}
    

1 个答案:

答案 0 :(得分:1)

add_works中,您没有以正确的方式构建WorkSelectForm。它期望可能/授权选项的查询集作为第一个参数,然后 POST数据。

此外,您还没有从表单中正确访问所选作品。您必须在表单上使用is_valid方法,然后使用cleaned_data中所述的work_search

从我在Work视图中看到的内容,您可以搜索哪些def add_works(request): #if request.method == POST: form = WorkSelectForm(Work.objects.all(), request.POST) if form.is_valid(): # the items are in form.cleaned_data['works'] items = form.cleaned_data['works'] return render_to_response("add_works.html", {"items":items}) else: # handle error case here ... 个对象然后添加到结果中没有限制,因此您可以这样做:

{{1}}