I am trying to build a blog using lektor CMS
, for that.. i needed a tags system, after searching i found a lektor plugin on lektor docs called lektor-tags
I followed every step on the docs, struggled a lot and even visited the github repo to see if is there anything else not included in the docs.
My problem is when i try to visit localhost:5000/{the_tag_name}
say like localhost:5000/python
i always get a 404 Not Found
saying that
The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.
This is what i did so far:
Before using lektor-tags
:
I changed the route for the blog posts to be
/posts
instead of/blog
.Added slug format to
models/blog.ini
in[children]
[children] model = blog-post order_by = pub_date, title slug_format = {{ (this.pub_date|dateformat('YYYY/M/') if this.pub_date) ~ this._id }}
Created 3 posts, everything was working properly.
At this point i wanted to use a tags system so i chosen to use lektor-tags
, what i did was:
Installation
lektor plugins add lektor-tags
Created
configs/tags.ini
with this config:parent = / url_path = {{ this.parent.url_path }}{{ tag }} tags_field = tags ignore_missing = true template = tags.html
Created
templates/tags.html
with the following content:{% extends "layout.html" %} {% block title %}{{ this.title }}{% endblock %} {% block body %} <div class="container mt-3"> <b>Tag: {{ this.tag }}</b> <b>Items:</b> <ul> {% for i in this.items %} <li><a href="{{ i|url }}">{{ i._id }}</a></li> {% else %} <li><em>No items.</em></li> {% endfor %} </ul> </div> {% endblock %}
Edited
models/blog-post.ini
and added:[fields.tags] type = strings
In
templates/blog-post.html
i added the following to show links to the page that contain a list of all posts with the specific tag:{% if this.tags %} <ul> {% for t in this.tags -%} <li> <a href="{{ ('/' ~ t.lower())|url }}"> All posts tagged {{ t }} </a> </li> {% endfor %} </ul> {% endif %}
Finally i updated a post to contain some tags from the admin and made sure it's there in
content.lr
for that post. so i stopped the lektor dev server and run it againlektor servor
with no errors to be present.
The links were there in the post for the tags but when i click and follow a link say for example for the python tag localhost:5000/python
i get 404 Not Found
. i am new to lektor. i'm wondering what i did wrong and how can i get this to work properly?
NB: Other plugins i used are lektor-minify
, lektor-disqus-comments
the docs for these plugins were straightforward and i didn't got confused, but when it comes to this specific plugin i were confused, struggling: the docs were not that great and explaining, i felt completely lost!
Update
I created a github repo containing the code and what i have done so far so you can easily replicate this.
Update 2
I managed to get this to work properly see my answer below, however now i'm wondering how to set the root as the parent in other words how to edit this expression :
<a href="{{ ('/posts@tag/' ~ t.lower())|url }}">
to generate a source path for each of the blog post's tags but using root as the parent. As you can see i tried this :
<a href="{{ ('/' ~ t.lower())|url }}">
but this doesn't work properly.
It's worth mentioning that lektor uses jinja2
templating language.
So Basically it was me doing this wrong because i wanted to use the root as the parent in
tags.ini
like so :I ended up changing the expression
'/blog@tag/' ~ t.lower()
inblog-post.html
to something like :making it not able to generate a source path for each of the blog post's tags
What i changed and worked was :
I chosen
posts
to be the parent, updated theconfigs/tags.ini
to :Updated
templates/blog-post.html
:After running
lektor clean --yes
thenlekor server
everything was working properly including the tags system.