Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Form (or Formset?) to handle multiple table rows in Django

Tags:

python

django

I'm working on my first Django application. In short, what it needs to do is to display a list of film titles, and allow users to give a rating (out of 10) to each film. I've been able to use the {{ form }} and {{ formset }} syntax in a template to produce a form which lets you rate one film at a time, which corresponds to one row in a MySQL table, but how do I produce a form that iterates over all the movie titles in the database and produces a form that lets you rate lots of them at once?

At first, I thought this was what formsets were for, but I can't see any way to automatically iterate over the contents of a database table to produce items to go in the form, if you see what I mean.

Currently, my views.py has this code:

def survey(request):
        ScoreFormSet = formset_factory(ScoreForm)
        if request.method == 'POST':
                formset = ScoreFormSet(request.POST, request.FILES)
                if formset.is_valid():
                        return HttpResponseRedirect('/')
        else:
                formset = ScoreFormSet()
        return render_to_response('cf/survey.html', {
                'formset':formset,
        })

And my survey.html has this:

<form action="/survey/" method="POST">
<table>
{{ formset }}
</table>
  <input type = "submit" value = "Submit">
</form>

Oh, and the definition of ScoreForm and Score from models.py are:

class Score(models.Model):
        movie = models.ForeignKey(Movie)
        score = models.IntegerField()
        user = models.ForeignKey(User)

class ScoreForm(ModelForm):
        class Meta:
                model = Score

So, in case the above is not clear, what I'm aiming to produce is a form which has one row per movie, and each row shows a title, and has a box to allow the user to enter their score.

If anyone can point me at the right sort of approach to this, I'd be most grateful.

like image 901
Ben Avatar asked Sep 14 '25 05:09

Ben


1 Answers

"At first, I thought this was what formsets were for, but I can't see any way to automatically iterate over the contents of a database table to produce items to go in the form, if you see what I mean."

You need to get a queryset. And you need to provide that queryset to your form as initial data. See using initial data with a formset for the code.

initial = [ list of { dictionaries }, one per form ] 

Interestingly, this is a direct feature of the model API through the values method of a queryset.

like image 172
S.Lott Avatar answered Sep 15 '25 18:09

S.Lott