Question erreur URL

Le problème exposé dans ce sujet a été résolu.

Bonjour tout le monde, alors je viens vous posez une question qui est peut être bête mais en gros j’ai fais une barre de recherche qui m'affiche des résultats et de c'est résultat je voudrais en faire des liens pour que lorsque je click dessus on m'affiche un DetailView de cette objet. le seul souci c'est j'ai une erreur depuis maintenant 2 jours et je n'arrive pas a la comprendre pour pouvoir la régler et pouvoir continuer. Si quel qu'un sait pourquoi j'ai cette erreur et pourrait me l'expliquer je lui en serait très reconnaissant.

L'erreur : Reverse for 'viewExp' with arguments '()' and keyword arguments '{'pk': <Experiment: test ID>}' not found. 1 pattern(s) tried: ['data/view/(?P<pk>[-\\w]+)/$']

mes différentes partit du code concernées:

l'url :

1
url(r'^view/(?P<pk>[-\\w]+)/$', ExperimentView.as_view(),name = 'viewExp')

ma view :

1
2
3
4
5
6
7
class ExperimentView(DetailView):
    context_object_name = "experiment"
    model = Experiment
    template_name = "data/View.html"
    def get_object(self):
        experiment = super(ExperimentView, self).get_object()
        return experiment  

et mon html :

1
2
3
4
5
6
{% if found_entries %}
    <p>You searched for "{{ query_string }}".</p>
    {% for i in found_entries %}
        <li><a href="{% url 'viewExp' pk=i %}">{{i}}</a> </li>
    {% endfor %}
{% endif %}
+0 -0

j'ai l'impression que ta regex est fausse. Personnellement j'aurais mis r'^view/(?P<pk>[\w-]+)/$'. D'une part car comme tu as déjà le marqueur r` tu n'as pas à doubler l'antislash et ensuite parce que le "-" doit forcément se trouver à la fin pour éviter qu'il ne pense que c'est un intervalle.

Bonjour,

Ma réponse suppose que tu utilise le moteur de template Django et pas une autre (Jinja2 par exemple).

Le message d'erreur laisse penser que le i reçu dans le template pk=i est un objet et non une chaine telle que attendue dans le pattern d'url.

Tu devrais donc corriger de cette façon dans ton template :

1
2
3
4
    {% for i in found_entries %}
        # n'oublie pas de remplacer attribut par l'attribut qui correspond à la chaine dans ton modèle lié à found_entries
        <li><a href="{% url 'viewExp' pk=i.attribut %}">{{i.attribut}}</a> </li>
    {% endfor %}

Effectivement j'utilise le moteur de template Django, J'ai essayé ce que tu ma proposé mais j'ai toujours l'erreur : Reverse for 'viewExp' with arguments '()' and keyword arguments '{'pk': 'test ID'}' not found. 1 pattern(s) tried: ['data/view/(?P<pk>[\w-]+)/$']

vus que c'est une piste que j'ai pas encore exploré je vais creusé dans ce sens ^^

Pour la derniere erreur que tu obtiens, voici l'explication :

L'expression regulière de ton url attend un w+, c'est a dire une chaine de caractère composée uniquement de lettre de l'alphabet ou de chiffres. Mais comme on peut le voir tu lui envois une chaine qui contient un espace test Id donc ça ne peut pas marcher ainsi.

Tu as donc deux options :

  • Soit tu t'assure effectivement que ce que j'ai appelé attribut plus haut contient uniquement des lettre de l'alphabet ou chiffres
  • Soit tu modifie l'expression regulière de ton fichier urls.py pour qu'elle accepte tous les caractères *+.

ça dépend de comment tu as codé ton moteur de recherche derrière. Je te laisse voir ce qui t'arrange le mieux

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte