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.
‘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.
Interestingly, this is a direct feature of the model API through the
valuesmethod of a queryset.