Partage
  • Partager sur Facebook
  • Partager sur Twitter

Django NoReverseMatch at offre

Sujet résolu
    21 janvier 2023 à 17:25:18

    Bonjour,

    Je code une plateforme avec django, et j'obtiens cette erreur sur mon navigateur :

    NoReverseMatch at /offre/

    Reverse for 'request_detail' with arguments '('',)' not found. 1 pattern(s) tried: ['request_detail/(?P<request_id>[0-9]+)\\Z']

     views.py :

    def care_requests(request):
        requests = PlantCareRequest.objects.filter(caretaker=request.user, status='pending').order_by('request_date')
        return render(request, 'care_requests.html', {'requests': requests})
    
    def care_request_detail(request, request_id):
        request = get_object_or_404(PlantCareRequest, pk=request_id, caretaker=request.user)
        if request.status == 'pending':
            if request.POST.get('accept'):
                request.status = 'accepted'
                request.save()
            elif request.POST.get('reject'):
                request.status = 'rejected'
                request.save()
        return render(request, 'care_request_detail.html', {'request': request})
    
    
    def make_care_request(request):
        if request.method == 'POST':
            form = CareRequestForm(request.POST)
            if form.is_valid():
                request = form.save(commit=False)
                request.status = 'pending'
                request.save()
                return redirect('care_requests')
        else:
            form = CareRequestForm()
        return render(request, 'make_care_request.html', {'form': form})
    

    urls.py

     path("requests/", blog.views.care_requests, name="request"),
        path('request_detail/<int:request_id>', blog.views.care_request_detail, name="request_detail"),
        path("make_request/", blog.views.make_care_request, name="make_request"),
    


    models.py :

    class Offre(models.Model):
        image = models.ImageField(verbose_name="Image d'annonce")
        titre = models.CharField(max_length=30)
        description = models.TextField(max_length=1000)
        reservation = models.BooleanField(default=False, verbose_name="Annonce réservée")
        alert = models.CharField(max_length=200, null = True)
        reserveur = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, related_name="Reserveur",
                                      on_delete=models.CASCADE)
        gardplanter = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, related_name="GardPlanter", on_delete=models.CASCADE)
        user_accept = models.BooleanField(default=None, verbose_name="Accept", null=True)
        user_refuse = models.BooleanField(default=None, verbose_name="Refuse", null=True)
    
        IMAGE_MAX_SIZE = (800, 800)
    
        def resize_image(self):
            image= Image.open(self.image)
            image.thumbnail(self.IMAGE_MAX_SIZE)
            # sauvegarde de l'image redimensionnée dans le système de fichiers
            # ce n'est pas la méthode save() du modèle !
            image.save(self.image.path)
    
        def save(self, *args, **kwargs):
            super().save(*args, **kwargs)
            self.resize_image()
    
    
    
    
    class PlantCareRequest(models.Model):
        requester = models.ForeignKey(User, on_delete=models.CASCADE, related_name='plant_care_requester')
        caretaker = models.ForeignKey(User, on_delete=models.CASCADE, related_name='plant_care_caretaker')
        status = models.CharField(max_length=10, choices=[('pending', 'Pending'), ('accepted', 'Accepted'), ('rejected', 'Rejected')])
        request_date = models.DateTimeField(auto_now_add=True)
    

    J'ai essayé plusieurs choses pour voir, mais ça n'a rien donné, malgré les forums que j'ai visité.

    En espérant que vous puissiez m'aider.

    Merci beaucoup.

    • Partager sur Facebook
    • Partager sur Twitter
      21 janvier 2023 à 17:42:19

      Les URLs se terminent par /

      Il faudrait déjà vérifier cela et bien vérifier l'utilisation de l'URL avec request_id.

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        21 janvier 2023 à 18:58:09

        J'ai terminé l'url par un / mais ça n'a pas changé.

        J'ai request.id qui apparait dans le fichier base.html :

        <p><a href="{% url 'request' %}">Requests</a></p>
                <p><a href="{% url 'request_detail' request.id %}">Request Detail</a></p>
                <p><a href="{% url 'make_request' %}">Make request</a></p>
        


        et dans le fichier care_requests.html :

        {% extends "base.html" %}
        
        {% block content %}
            <h1>Demandes de garde de plantes</h1>
            <table>
                <thead>
                    <tr>
                        <th>Demandeur</th>
                        <th>Statut</th>
                        <th>Date de la demande</th>
                        <th>Actions</th>
                    </tr>
                </thead>
                <tbody>
                    {% for request in requests %}
                        <tr>
                            <td>{{ request.requester.username }}</td>
                            <td>{{ request.status }}</td>
                            <td>{{ request.request_date }}</td>
                            <td><a href="{% url 'care_request_detail' request.id %}">Voir les détails</a></td>
                        </tr>
                    {% endfor %}
                </tbody>
            </table>
        {% endblock %}

        Mais je ne vois toujours pas ou ça cloche.
        Merci pour ta réponse.

        • Partager sur Facebook
        • Partager sur Twitter
          21 janvier 2023 à 23:59:29

          L'erreur "NoReverseMatch" indique qu'il y a une erreur dans la configuration de vos URLs, plus particulièrement dans la vue "care_request_detail". Il semble que vous essayez de passer un argument "request_id" qui n'est pas présent dans l'URL.

          Dans votre fichier urls.py, vous avez défini une URL pour la vue "care_request_detail" qui attend un argument "request_id" de type "int". path('request_detail/<int:request_id>', blog.views.care_request_detail, name="request_detail"),

          Dans votre vue "care_request_detail", vous utilisez cet argument pour récupérer un objet "PlantCareRequest" à partir de la base de données en utilisant la fonction get_object_or_404() : request = get_object_or_404(PlantCareRequest, pk=request_id, caretaker=request.user)

          Il semblerait que vous n'avez pas passé d'argument "request_id" lorsque vous appelez la vue "care_request_detail", d'où l'erreur "Reverse for 'request_detail' with arguments '('',)' not found.".

          Il y a plusieurs façons de résoudre ce problème, selon ce que vous voulez faire exactement.

          • Si vous voulez afficher une liste de demandes de soins pour l'utilisateur connecté, vous devriez utiliser une boucle pour afficher toutes les demandes dans une liste, et inclure un lien vers la page de détail pour chaque demande. Ce lien devrait inclure un paramètre "request_id" pour identifier la demande à afficher.
          • Si vous voulez afficher la page de détail pour une demande spécifique, vous devriez inclure un paramètre "request_id" dans l'URL lorsque vous appelez la vue "care_request_detail", par exemple en utilisant un lien HTML qui pointe vers l'URL "request_detail" avec l'argument "request_id" approprié.

          Il vous faut donc revoir votre code pour vérifier comment vous appelez la vue "care_request_detail" et comment vous passez l'argument "request_id" pour identifier la demande de soins à afficher.

          Voici un exemple de correction possible pour votre code:

          views.py :

          def care_requests(request):
              requests = PlantCareRequest.objects.filter(caretaker=request.user, status='pending').order_by('request_date')
              return render(request, 'care_requests.html', {'requests': requests})
          
          def care_request_detail(request, request_id):
              request_obj = get_object_or_404(PlantCareRequest, pk=request_id, caretaker=request.user)
              if request.method == 'POST':
                  if request.POST.get('accept'):
                      request_obj.status = 'accepted'
                      request_obj.save()
                  elif request.POST.get('reject'):
                      request_obj.status = 'rejected'
                      request_obj.save()
              return render(request, 'care_request_detail.html', {'request': request_obj})
          
          def make_care_request(request):
              if request.method == 'POST':
                  form = CareRequestForm(request.POST)
                  if form.is_valid():
                      request_obj = form.save(commit=False)
                      request_obj.status = 'pending'
                      request_obj.save()
                      return redirect('care_requests')
              else:
                  form = CareRequestForm()
              return render(request, 'make_care_request.html', {'form': form})
          

          urls.py :

          path("requests/", blog.views.care_requests, name="request"),
          path('request_detail/<int:request_id>', blog.views.care_request_detail, name="request_detail"),
          path("make_request/", blog.views.make_care_request, name="make_request"),
          

          Le problème avec votre code initial est que vous utilisez une variable request pour stocker l'objet de la demande de soins de plante, et une autre variable request pour l'objet HttpRequest de la requête courante. Cela crée une confusion et entraîne une erreur lorsque vous utilisez request.user ou request.POST dans vos fonctions de vue.

          Dans l'exemple ci-dessus, j'ai changé le nom de la variable request pour request_obj dans la fonction care_request_detail pour éviter cette confusion. J'ai également déplacé la logique de mise à jour de l'état de la demande de soins de plante dans cette fonction pour s'assurer qu'elle ne soit exécutée que lorsque la méthode HTTP est POST.

          j'espère que sa pourrais t'aidé




          • Partager sur Facebook
          • Partager sur Twitter
            22 janvier 2023 à 15:51:08

            D'accord merci beaucoup, j'ai réussi à résoudre le problème.

            Merci beaucoup et bonne continuation.

            -
            Edité par yaruco 24 janvier 2023 à 5:43:02

            • Partager sur Facebook
            • Partager sur Twitter
              22 janvier 2023 à 19:53:03

              yaruco a écrit:

              D'accord merci beaucoup, j'ai reçu à résoudre le problème.

              Bonjour,

              Sujet résolu

              Tu peux passer le sujet à "résolu" (bouton en haut à droite du sujet) et cliquer sur les pouces levés des messages qui t'ont aidé⋅e ;)

              • Partager sur Facebook
              • Partager sur Twitter

              Django NoReverseMatch at offre

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown