Vous n'êtes pas identifié(e).
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
y a donc pas de solution ?
Hors ligne
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
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
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
merci beaucoup pour cette idee, je vais y travailler
Hors ligne
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
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
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
ca marche je te remercie !!
Hors ligne