Django-fr

Forum

#1 23-01-2013 07:39:54

sesame
Membre
Inscription : 22-03-2011
Messages : 263

filtrage specifique

Bonjour

j'ai cree une base de donnees materiaux dont voici le modele


class Category(models.Model):
    name = models.CharField(_('name'), max_length=50)
    slug = models.SlugField()
    description = models.TextField(_('description'), blank=True)

    parent = models.ForeignKey('self', null=True, blank=True,
                               verbose_name=_('parent category'),
                               related_name='children')


class Material(models.Model):
    name = models.CharField(_('name'), max_length=50)
    description = models.TextField(_('description'), blank=True)
    slug = models.SlugField()
    category = models.ForeignKey(Category, verbose_name=_('category'))
    created = models.DateField(_("Date de creation"), auto_now_add=True)




je veux pouvoir acceder

soit a l'ensemble des materiaux de la base
soit a une categorie particuliere

j'utilise pour ceci un menu deroulant pour aller selectionner une option de filtrage

ce menu appelle une fonction specifique du module views

si je veux visualiser l'ensemble des materiaux

dans ma fonction, je declare

data1 = Material.objects.objects.all()

et si je veux acceder a la categorie 'ceramique', je declare

data1= Material.objects.filter(category__name= 'ceramique')


y a t 'il moyen d'acceder a un filtrage particulier sans etre obligé de declarer explicitement la categorie ?? et de faire appel a une fonction differente a chaque fois  ??

Hors ligne

#2 29-01-2013 12:27:47

sesame
Membre
Inscription : 22-03-2011
Messages : 263

Re : filtrage specifique

y a donc pas de solution ?

Hors ligne

#3 29-01-2013 20:02:34

poulp
Membre
Inscription : 29-01-2013
Messages : 2

Re : filtrage specifique

J'ai du mal à comprendre ta question ^^
Qu'entend tu par "filtrage particulier" ?

cat = Category.objects.filter(name="ceramique")
data1 = Material.objects.filter(category=cat)

Dernière modification par poulp (29-01-2013 20:02:51)

Hors ligne

#4 30-01-2013 08:12:39

sesame
Membre
Inscription : 22-03-2011
Messages : 263

Re : filtrage specifique

soit on fait une recherche sur toute la base (tous les enregistrements)

data1 = Material.objects.all()

soit on fait une recherche dans un repertoire specifique

si le repertoire s'appelle ceramique

alors le filtrage s'ecrira : data1= Material.objects.filter(category__name= 'ceramique')

donc il faudra bien specifier ce nom quelque part comme ici ou je renvoie le nom ceramique dans mon template qui m'affiche un formulaire de saisie
de donnees de filtrage

def resout30(request):
    lafamille= 'ceramique'
    return render_to_response('material/critere2F.html',
                              {'unefamille': lafamille},
                                     context_instance=RequestContext(request))

donc il est impossible d eviter de passer par l'etape  lafamille= 'ceramique'

Hors ligne

#5 04-02-2013 15:40:51

Yukilas
Membre
Inscription : 12-08-2010
Messages : 5

Re : filtrage specifique

Bonjour,

Si tu veux pouvoir récupérer la liste des matériaux présents dans une catégorie tu as forcément besoin de spécifier à un moment ou un autre la catégorie (que se soit son nom, slug, id etc).

Tu peux par exemple créer une vue comme celle-ci (à améliorer mais c'est pour l'idée):

def get_materials(request, category_slug=None):
    if category_slug is None:
        return Material.objects.all()
    return Material.objects.filter(category__slug=category_slug)

Avec les urls qui correspondent:

url(r"/materials/all/", get_materials, name="get_all_materials")
url(r"/materials/(?P<category_slug>[\w\d]+)/", get_materials, name="get_materials_from_category")

Dans ton template tu pourras ainsi appeler l'une ou l'autre des urls en fonction de ce que tu as besoin.

Hors ligne

#6 05-02-2013 11:08:40

sesame
Membre
Inscription : 22-03-2011
Messages : 263

Re : filtrage specifique

merci beaucoup pour cette idee, je vais y travailler

Hors ligne

#7 06-02-2013 09:13:54

sesame
Membre
Inscription : 22-03-2011
Messages : 263

Re : filtrage specifique

jai modifié mon code suivant :

def get_materials(request, category_slug=None):
    if category_slug is None:
        return render_to_response('material/critere2.html',
                                     context_instance=RequestContext(request))
    else:
        lafamille= category_slug
        return render_to_response('material/critere2F.html',
                                  {'unefamille': lafamille},
                                   context_instance=RequestContext(request))

et les urls :

url(r'^materials/all/$', 'monprojet.material.views.get_materials', name="get_all_materials"),
url(r'^materials/(?P<category_slug>[\w\d]+)/', 'monprojet.material.views.get_materials', name="get_materials_from_category")


dans mon menu deroulant j'accede a une categorie par

<LI><A href="{% url get_all_materials %}  ">Toutes Familles</A></LI>

ou bien

<LI><A href="{% url get_materials_from_category %}"> ceramique</A></LI>

la premiere passe bien
mais pour la deuxieme j' ai l'erreur

Reverse for 'get_materials_from_category' with arguments '()' and keyword arguments '{}' not found.
l 'erreur pointant sur  <LI><A href="{% url 'get_materials_from_category' %}"> ceramique</A></LI>

comment faire ?
c'est parceque deux urls pointent sur la même vue ?

Dernière modification par sesame (06-02-2013 09:59:15)

Hors ligne

#8 06-02-2013 10:10:47

Yukilas
Membre
Inscription : 12-08-2010
Messages : 5

Re : filtrage specifique

Quand tu as une url comme celle-ci:

url(r"/materials/(?P<category_slug>[\w\d]+)/", get_materials, name="get_materials_from_category")

Le (?P<category_slug>[\w\d]+) signifie que le slug précisé après le "/materials/" va être récupéré et passé à la vue dans une variable "category_slug".
Quand tu crée un lien vers cette url il faut donc que tu précise cet argument, ce slug. Ça donnerait quelque chose comme ça: <a href="/materials/ceramique/">

En utilisant le template tag url de Django tu peux précisé un argument comme cela:

<a href="{% url get_materials_from_category 'ceramique' %}">

Ou si tu récupère automatiquement le slug de l'objet:

<a href="{% url get_materials_from_category material.slug %}">

Hors ligne

#9 06-02-2013 10:39:09

sesame
Membre
Inscription : 22-03-2011
Messages : 263

Re : filtrage specifique

que ce soit 'ceramique' ou material.slug,

j'ai toujours

Reverse for 'get_materials_from_category' with arguments '('',)' and keyword arguments '{}' not found.

dans le cas  <a href="{% url get_materials_from_category material.slug %}">

et Reverse for 'get_materials_from_category' with arguments '(u'ceramique',)' and keyword arguments '{}' not found.

dans le cas <a href="{% url get_materials_from_category 'ceramique' %}">

Hors ligne

#10 06-02-2013 10:49:33

sesame
Membre
Inscription : 22-03-2011
Messages : 263

Re : filtrage specifique

ca marche je te remercie !!

Hors ligne

Pied de page des forums