Retrieving models from form with ModelMultipleChoiceField

Posted by colinjameswebb on Stack Overflow See other posts from Stack Overflow or by colinjameswebb
Published on 2010-04-12T19:48:00Z Indexed on 2010/04/12 19:53 UTC
Read the original article Hit count: 229

Filed under:
|

I am having difficulties with forms, specifically ModelMultipleChoiceField.

I've pieced together this code from various examples, but it sadly doesn't work.

I would like to be able to:

  1. Search for some Works on work_search.html
  2. Display the results of the search, with checkboxes next to each result
  3. Select the Works I want, via the checkboxes
  4. After pressing Add, display which works were selected.

I believe everything is okay except the last part. The page simply displays "works" :(

Here is the code - sorry about the length.

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 %}

© Stack Overflow or respective owner

Related posts about django

Related posts about django-forms