MaxDragonheart
MaxDragonheart

Reputation: 1290

Order post by date

I've created a list of post and now I want order this list by date of publishing. If I use order_by(-post_publishing_date) in the view the shell show me this error:

NameError: name 'post_publishing_date' is not defined

models.py

class PostModel(models.Model):
    post_title = models.CharField(max_length=70)
    post_short_description = models.TextField(max_length=200)
    post_contents = models.TextField()
    post_publishing_date = models.DateTimeField(auto_now=False, auto_now_add=True)
    post_author = models.ForeignKey(AuthorModel, on_delete=models.CASCADE, related_name="connected_author")
    post_keyconcept = models.ManyToManyField(KeyConceptModel, related_name="connected_keyconcept")
    slug = models.SlugField(verbose_name="Slug", unique="True")
    post_highlighted = models.BooleanField(default=False)

    def __str__(self):
        return self.post_title

    def get_absolute_url(self): 
        return reverse("singlepostManuscriptusView", kwargs={"slug": self.slug})

    class Meta:
        verbose_name = "Articolo"
        verbose_name_plural = "Articoli"  

views.py

class SinglePostGDV(DetailView):
    model = PostModel
    template_name = "manuscriptus_post_detail.html"


class ListPostGDV(ListView):
    model = PostModel
    template_name = "manuscriptus_home.html"
    queryset = PostModel.objects.filter().order_by(-post_publishing_date)

urls.py

urlpatterns = [
    path("it/blog/", ListPostGDV.as_view(), name="homeManuscriptusView"),
    path("it/blog/<slug:slug>/", SinglePostGDV.as_view(), name="singlepostManuscriptusView"), 
]

What I did wrong?

Upvotes: 1

Views: 46

Answers (2)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476574

Ad hoc ordering

Well Python is correct. There is no identifier post_publishing_date, you pass the name of the column through a string, so:

class ListPostGDV(ListView):
    model = PostModel
    template_name = "manuscriptus_home.html"
    queryset = PostModel.objects.filter().order_by('-post_publishing_date')

Define an inherent ordering on the model

Note that you can also give a model an "inherent" ordering in the Meta class:

class PostModel(models.Model):
    post_title = models.CharField(max_length=70)
    post_short_description = models.TextField(max_length=200)
    post_contents = models.TextField()
    post_publishing_date = models.DateTimeField(auto_now=False, auto_now_add=True)
    post_author = models.ForeignKey(AuthorModel, on_delete=models.CASCADE, related_name="connected_author")
    post_keyconcept = models.ManyToManyField(KeyConceptModel, related_name="connected_keyconcept")
    slug = models.SlugField(verbose_name="Slug", unique="True")
    post_highlighted = models.BooleanField(default=False)

    def __str__(self):
        return self.post_title

    def get_absolute_url(self): 
        return reverse("singlepostManuscriptusView", kwargs={"slug": self.slug})

    class Meta:
        ordering = ['-post_publishing_date']
        verbose_name = "Articolo"
        verbose_name_plural = "Articoli"

If you do this, all queries to this model will implicitly be ordered by -post_publishing_date. So this means that you can not "forget" to order the objects properly.

So then you do not have to order it in the views. You can of course only define one such "inherent" ordering, and it is not clear if you want to use one here.

Upvotes: 3

neverwalkaloner
neverwalkaloner

Reputation: 47354

order_by argument should be string:

queryset = PostModel.objects.filter().order_by('-post_publishing_date')

Upvotes: 1

Related Questions