Avec Django, les variables des templates sont typées

On imagine donc que mon fichier de modèle est :

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from django.db import models

# Qualifies something to do
class Task(models):
    title    = models.CharField(max_length=50)
    content  = models.TextField()
    priority = models.ForeignKey(Priority)

# A Priority for a given task
class Priority(models):
    num  = models.IntegerField(max_length=3)
    name = models.CharField(max_length=50)

J'ai maintenant une vue qui me permet de lister toutes mes tâches:

def list_tasks(request):
   prio = request.GET.get('p')
   items = Task.objects.all().order_by(priority__num)

   if prio and prio.isdigit():
     items = items.filter(priority__num=prio)

   return list_detail.object_list(
                request,
                template_name = 'path/to/view.html',
                queryset = items,
                template_object_name= 'tasks',
                extra_context = {
                                'priorities': Priority.objects.order_by('num'),
                                'current_prio': prio,
                },
   )

Et enfin dans ma vue:

{% if priorities %}
<form method="get">
  <select name="p">
   <option value="0">All</option>
{% for p in priorities %}
   <option value="{{p.num}}"{% ifequal p.num current_prio %} selected="selected" {% endifequal %}>{{ p.name }}</option>
{% endfor %}
  </select>
  <input type="submit" value="filter" />
</form>
{% endif %}

{% if tasks_list %}
<ul>
{% for task in tasks_list %}
   <li>{{ task.title }} ({{ task.priority.name }})</li>
{% endfor %}
</ul>
{% else %}
  <p>No such entry!</p>
{% endif %}

Seulement voilà, en ayant beau filter la liste de mes tâches (ce qui fonctionne), pas moyen de faire en sorte que ce fichu formulaire conserve la valeur courante de la prioritée choisie.

La solution? Regardez dans le titre. Et oui, si quelque part dans la vue (au hazard, dans le extra_contexte) on vient dire explicitement que current_prio est un nombre, ça fonctionne!

                extra_context = {
                                'priorities': Priority.objects.order_by('num'),
                                'current_prio': int(prio),
                },

Add new comment

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.