Search code examples
python-3.xdjango-2.0

How can I list all the nodes in my database?


I'm trying to create a simple model Node and a simple web page that shows all of my nodes in a list. But it seems not working and everytime I change the code I got a new error. So I gave up and came to here.This is what I did: I created a Node model:

class Node(models.Model):
    ID = models.DecimalField(max_digits=9, decimal_places=6)
    nb_solenoid = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True)
    connexion = models.CharField(max_length=255)

    def get_absolute_url(self):
        return reverse("node:index", kwargs={"id": self.id})

with this form:

class NodeForm(forms.ModelForm):
ID = forms.DecimalField(initial=0)
nb_solenoid = forms.DecimalField(initial=1)
connexion = forms.CharField(required=False,
                            widget=forms.Textarea(
                                  attrs={
                                      "placeholder": "type of connexion"
                                  }))
    class Meta:
        model = Node
        fields = [
            'ID',
            'nb_solenoid',
            'connexion'
        ]

And this is my views.py:

def index(request):
    queryset = Node.objects.all()
    context = {
        "object_list": queryset
    }
    return render(request, "node/index.html", context)

This is my code in urls.py:

urlpatterns = [path('', views.index, name='index')]

When I call this url: http://localhost:8000/node I get this error now:

NoReverseMatch at /node
Reverse for 'index' with keyword arguments '{'id': 1}' not found. 1 pattern(s) tried: ['node$']

What is a NoReverseMatch error and how do I fix my problem? Let me say that I'm a Django beginner developer. Thank you.


Solution

  • The issue is that your named url path node:index takes no arguments (presumably because that view is just listing out all the nodes, not a specific node), yet your model's get_absolute_url is trying to reverse the pattern with a kwarg of id. The core problem is your get_absolute_url method; however, you really probably also would benefit from just using class based generic views:

    urls.py:

    urlpatterns = [
      path('nodes/', NodeList.as_view(), name="node-list"),
      path('node/<id>/', NodeDetail.as_view(), name="node-detail")
    ]
    

    view.py:

    from django.views.generic import ListView, DetailView
    
    from .models import Node
    
    
    class NodeList(ListView):
       model = Node
    
    
    class NodeDetail(DetailView):
       model = Node
    

    models.py:

    class Node(models.Model):
      <snip>
        def get_absolute_url(self):
            return reverse("node-detail", kwargs={"id": self.id})
    

    I really should have mentioned, documentation for class based generic views are at: https://docs.djangoproject.com/en/2.1/topics/class-based-views/generic-display/