TemplateSyntaxError at /admin/ Invalid block tag on line 23: 'translate', expected 'endblock'. Did you forget to register or load this tag? - django-templates

**
TemplateSyntaxError at /admin/
Invalid block tag on line 23: 'translate', expected 'endblock'. Did you forget to register or load this tag?
Request Method: GET
Request URL: http://127.0.0.1:8000/admin/
Django Version: 2.1
Exception Type: TemplateSyntaxError
Exception Value:
Invalid block tag on line 23: 'translate', expected 'endblock'. Did you forget to register or load this tag?
Exception Location: C:\Users\subramanyam.s.g\PycharmProject\pyyshop\LEARN\lib\site-packages\django\template\base.py, line 522, in invalid_block_tag
Python Executable: C:\Users\subramanyam.s.g\PycharmProject\pyyshop\LEARN\Scripts\python.exe
Python Version: 3.8.3**

I also happened to come across this error while using Django Version: 2.1.
I was customizing the admin look and feel as per the django documentation 3.1 https://docs.djangoproject.com/en/3.1/intro/tutorial07/.
Django Version: 2.1 can be hosted in a shared hosting domain with reference to https://pythonfusion.com/deploy-django-on-shared-hosting/.
Here is part of the screenshot to just show you i got the same error and see where the problem https://i.stack.imgur.com/RV52y.png
If you have difficulty finding where the Django source files(the ones you want to customise eg admin) are located on your system, use the following procedure:
In your computer locate where your django project is located in the file explorer e.g
C:\Users\yourname\Desktop\yourproject.
In your file explorer window, there is a path above your folder showing your current
location in the file explorer e.g This PC > Desktop > yourproject. Click inside this
path and rewrite cmd and then hit enter key on your keyboard. A command prompt will be
opened.
Now if you installed django in a global environment, that is, in local disk without
creating a virtual environment enter this code python -c "import django; print(django.__path__)" in the opened command prompt.
If you installed Django into the virtual environment then activate first the virtual environment using still the opened Command prompt, i normally use workon myvirtualenvironmentname to activate my virtual environment. Then paste this code python -c "import django; print(django.__path__)" in the opened command prompt.
Hit enter key on your keyboard and you will see something like this ['C:\\Users\\yourname\\Envs\\yourvirtualenvironmentname\\lib\\site-packages\\django']. This is the location we should arrive to access the Django resources.
Go to your file explorer by pressing CTRL + E on your keyboard.
Navigate to your local disk C, open the Users folder, next open the folder with your name next locate and open the Envs folder and locate your yourvirtualenvironmentname your project is using.
Open your yourvirtualenvironmentname> Lib > site-packages > django > contrib > admin > templates >admin.
You should be here C:\Users\yourname\Envs\yourvirtualenvironmentname\Lib\site-packages\django\contrib\admin\templates\admin in your machine.
Now take key note on the Django version you are using. Where we are currently there are some files that are in Django Version: 2.1 and not in Django Version: 3.1 e.g app_list.html is in Django Version 2.1 and not in 3.1 with respect to this directory where we are.
Note 2. The file names maybe the same but the content inside the file may differ slightly and this is what causes the error
The code below is some of the content in base.html (i have just copied a few of the code where i want to emphasize ) from Django V 3.1.
base.html from Django Version 3.1
`
{% if not is_popup %}
<!-- Header -->
<div id="header">
<div id="branding">
{% block branding %}{% endblock %}
</div>
{% block usertools %}
{% if has_permission %}
<div id="user-tools">
{% block welcome-msg %}
{% translate 'Welcome,' %}
<strong>{% firstof user.get_short_name user.get_username %}</strong>.
{% endblock %}
{% block userlinks %}
{% if site_url %}
{% translate 'View site' %} /
{% endif %}
{% if user.is_active and user.is_staff %}
{% url 'django-admindocs-docroot' as docsroot %}
{% if docsroot %}
{% translate 'Documentation' %} /
{% endif %}
{% endif %}
{% if user.has_usable_password %}
{% translate 'Change password' %} /
{% endif %}
{% translate 'Log out' %}
{% endblock %}
</div>
{% endif %}
{% endblock %}
{% block nav-global %}{% endblock %}
</div>
<!-- END Header -->
{% block breadcrumbs %}
<div class="breadcrumbs">
{% translate 'Home' %}
{% if title %} › {{ title }}{% endif %}
</div>
{% endblock %}
{% endif %}
<div class="main shifted" id="main">
{% if not is_popup and is_nav_sidebar_enabled %}
{% block nav-sidebar %}
{% include "admin/nav_sidebar.html" %}
{% endblock %}
{% endif %}
<div class="content">
{% block messages %}
{% if messages %}
<ul class="messagelist">{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message|capfirst }}</li>
{% endfor %}</ul>
{% endif %}
{% endblock messages %}
<!-- Content -->
<div id="content" class="{% block coltype %}colM{% endblock %}">
{% block pretitle %}{% endblock %}
{% block content_title %}{% if title %}<h1>{{ title }}</h1>{% endif %}{% endblock %}
{% block content %}
{% block object-tools %}{% endblock %}
{{ content }}
{% endblock %}
{% block sidebar %}{% endblock %}
<br class="clear">
</div>
<!-- END Content -->
{% block footer %}<div id="footer"></div>{% endblock %}
</div>
</div>
`
I wanted to highlight these lines of code but i was unable. So check of the following in your base.html {% translate 'Welcome,' %}, {% translate 'View site' %}, {% translate 'Documentation' %}, {% translate 'Change password' %}, {% translate 'Log out' %} and {% translate 'Home' %}.
Lets compare the above base.html file with that of Django Version 2.1. Take a close look to discover the difference.
base.html file in Django Version 3.1
`
{% if not is_popup %}
<!-- Header -->
<div id="header">
<div id="branding">
{% block branding %}{% endblock %}
</div>
{% block usertools %}
{% if has_permission %}
<div id="user-tools">
{% block welcome-msg %}
{% trans 'Welcome,' %}
<strong>{% firstof user.get_short_name user.get_username %}</strong>.
{% endblock %}
{% block userlinks %}
{% if site_url %}
{% trans 'View site' %} /
{% endif %}
{% if user.is_active and user.is_staff %}
{% url 'django-admindocs-docroot' as docsroot %}
{% if docsroot %}
{% trans 'Documentation' %} /
{% endif %}
{% endif %}
{% if user.has_usable_password %}
{% trans 'Change password' %} /
{% endif %}
{% trans 'Log out' %}
{% endblock %}
</div>
{% endif %}
{% endblock %}
{% block nav-global %}{% endblock %}
</div>
<!-- END Header -->
{% block breadcrumbs %}
<div class="breadcrumbs">
{% trans 'Home' %}
{% if title %} › {{ title }}{% endif %}
</div>
{% endblock %}
{% endif %}
{% block messages %}
{% if messages %}
<ul class="messagelist">{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message|capfirst }}</li>
{% endfor %}</ul>
{% endif %}
{% endblock messages %}
<!-- Content -->
<div id="content" class="{% block coltype %}colM{% endblock %}">
{% block pretitle %}{% endblock %}
{% block content_title %}{% if title %}<h1>{{ title }}</h1>{% endif %}{% endblock %}
{% block content %}
{% block object-tools %}{% endblock %}
{{ content }}
{% endblock %}
{% block sidebar %}{% endblock %}
<br class="clear">
</div>
<!-- END Content -->
{% block footer %}<div id="footer"></div>{% endblock %}
`
You will see the following in your base.html {% trans 'Welcome,' %}, {% trans 'View site' %}, {% trans 'Documentation' %}, {% trans 'Change password' %}, {% trans 'Log out' %} and {% trans 'Home' %}.
To solve your *TemplateSyntaxError at /admin/ Invalid block tag on line 23: 'translate', expected 'endblock'. Did you forget to register or load this tag?
*
Just rename the translate to trans and save your file. In conclusion whenever you will add app_list.html or any other file in your admin folder and get and error. Just open the file and rename anything that has translate to trans. This solved my problem.
Incase i miss quoted something for example the django versions remember to let me know. Lets learn together. Thank you

Only way I can come up with for this could happen is if you've created a custom tag module named 'i18n' which would override the builtin i18n module. I can reproduce it by creating a file 'i18n.py' in my app's templatetags/ folder - is that what you have done?

In my case it was a template I've copied and modified. The template was from newer version of django. After upgrading django it all normalised.

Related

Shopify: Product grid - how overwrite a Product STOCK-OUT msg, with "Coming Soon" if it's in a ComingSoon collection

Our existing theme displays a 'Stock Out' banner over the product image if there is no stock.
We want to change this banner to "Coming Soon" if the Product is in a ComingSoon Collection.
The theme's 'product-grid-item.liquid file contains:
<a href="{{ product.url | within: current_collection }}" class="product-grid-item">
<div class="product-grid-image">
<div class="product-grid-image--centered">
{% if sold_out %}
<div class="badge badge--sold-out"><span class="badge-label">{{ 'products.product.sold_out' | t }}</span></div>
{% endif %}
...
Which I changed to:
<!-- added ###For Test ### -->
{% assign found_collection = false %}
{% for collection in product.collections %}
{% if collection.handle contains 'Coming Soon' %}
{% assign found_collection = true %}
{% break %}
{% endif %}
{% endfor %}
{% if found_collection %}
<div class="badge badge--sold-out"><span class="badge-label">Coming Soon</span></div>
{% else %}
<div class="badge badge--sold-out"><span class="badge-label">{{ 'products.product.sold_out' | t }}</span></div> <!-- this is the original line of code -->
{% endif %}
<!-- end of added code -->
But is doesn't work, all 'no-stock' products display with the banner "Stock out"
Nb The actual Title of the ComingSoon collection is "Coming Soon ..." - so the contains statement should work?
We could change the code to look for a Tag, but admin maintaining a tag would be more work.
Most likely this is because 'Coming Soon' is not the correct handle. A handle is part of your URL that can be found under Collection SEO inside the admin panel
e.g. store.myshopify.com/collections/my-collection -> my-collection is the handle

Shopify linking product using SEO handle

I followed the directions for the second way to tag a product to a blog
This is the website I used https://happypoints.io/shopify-add-products-to-blog-post-c2-stt-66/
This is the code that was entered
{% assign my_description = article.content | split: '=== split content ===' %}
{% assign my_description_size = my_description.size | minus: 2 %}
{{ my_description | first}}
<div class="show-product-list">
{% if article.tags.size > 0 %}
{% for tag in article.tags %}
{% paginate collections.all.products by 100 %}
{%- for product in collections.all.products -%}
{% if product.handle == tag %}
<div class="product_item">
{% include 'product-card-list' %}
</div>
{% endif %}
{%- endfor -%}
{% endpaginate %}
{% endfor %}
{% endif %}
</div>
{{ my_description | last}}
after following all the directions I received an error message saying
Liquid error (sections/article-template.liquid line 42): Could not find asset snippets/product-card-list.liquid
I am not sure why the product wont link to the blog using the seo handle
Your code has a line:
{% include 'product-card-list' %}
That means Shopify expects to find some asset named product-card-list.liquid. Since it cannot, you get that error. Add that snippet of code, and your error will disappear.

Can i have group_vars used in Jijnja2 template?

I have the following variable that i want to use in Jinja2 template and i am not sure if it is even possible
tag: pony
This is how I tried using it:
{% if ansible_fqdn in groups['machines-{{ tag }}'] %}
{% for host in groups['machines-{{ tag }}'] %}
echo "Do some magic with my {{ tag }}"
{% endfor %}
{% endif %}
Is it possible ? And how of course :)
Thanks !
This works for me
{% set group = 'machine-' + tag %}
{% if ansible_fqdn in groups[group] %}
{% for host in groups[group] %}
echo "Do some magic with my {{ tag }}"
{% endfor %}
{% endif %}

How to add collection.liquid to an existing page?

In Shopify, I'm trying to take the template collection.liquid and render it in another page, just like embedding it. But i'm not sure how to accomplish that.
{% paginate collection.products by 50 %}
{% include 'breadcrumb' %}
{% if settings.show_sort_by and collection.products_count > 1 %}
{% include 'collection-sort' %}
{% endif %}
{% if current_tags.size > 0 %}
<h1>{{ current_tags.first }}</h1>
{% else %}
{% endif %}
{% if collection.description.size > 0 %}
<!--START HERO-->
<!--END HERO-->
{% endif %}
<!--START PRODUCT GRID-->
<section class="product-grid twelve columns alpha omega">
<div id="collection_hero" class="collection_hero_class">
<img src="http://carnegie.org/fileadmin/Media/News/press_releases/whitehouse.JPG">
</div>
{% if collection.products.size > 0 %}
{% for product in collection.products %}
{% include 'product-grid-item' %}
{% endfor %}
{% else %}
<p id="no-products" class="animated fadeInUpBig">There aren't any products in this collection!</p>
{% endif %}
</section>
<!--END PRODUCT GRID-->
{% include 'paging' %}
{% endpaginate %}
I've been trying to do the same thing and kept getting errors.
Fixed it by making a new Snippet called list-collections and copying everything from list-collections.liquid into that. Then made a page template called page.list-collections.liquid and pasted this code into that before /div: {% include 'list-collections' %}
Then, I made a new page using the page.list-collections template, and entered my introductory text, images etc in that, which displays above product collections on the page when published :)
Copy everything that's in collection.liquid and paste it into a new snippet (let's say you call it collection-copy.liquid).
Then, in the page you want to add the collections page to, just add {% include 'collection-copy' %}
That should just dump everything that's in collection-copy.liquid and output it to your page.
The simplest way to do so is to :
Create a new page template for example : page.list-collections
Then place under : {{ page.content }} this line :
{% section 'list-collections-template' %}
Now create a new page in Shopify then select the new page template.
Normally you should be able to add new collections in the "Customize" section of your page !

Django template inheritance the other way round

Django template system lets you easily specify a template and fill it with different data using extends and blocks.
What I need to do is to have several templates, filled with the same data (blocks) while avoiding code repetition. It sounds like a usecase for templatetags but consider this example:
<div class="container">
{% get_tags page as tags %}
{% if tags %}
<div class="ribbon">
<span class="ribbon-inner">{{ tags|join:' | ' }}</span>
</div>
{% endif %}
</div>
If I wanted to display the tags in another template using a different html elements/classes I would have to create at least two templatetags (has_tags and get_tags) or include html in templatetags code.
I'd like to have something like this:
#common.html
{% block tags %}
{% get_tags page as tags %}
{% if tags %}
<div class="ribbon">
<span class="ribbon-inner">{{ tags|join:' | ' }}</span>
</div>
{% endif %}
{% endblock %}
#template_A.html
{% include common.html %}
<div class="container-1">
{% block tags %}
{{ block.super }}
{% endblock %}
</div>
#template_B.html
{% include common.html %}
{% block tags %}
{% get_tags page as tags %}
{{ tags|join:', ' }}
{% endblock %}
The problem is that include renders the template first, therefore it doesn't work this way. There are a lot of similar points in the file I'm editing, so creating and including template for each of them is not a great solution either.
Any thoughts?
Well, this is my solution:
#templateA.html
{% include "_common.html" with parent_file="_templateA.html" %}
#templateB.html
{% include "_common.html" with parent_file="_templateB.html" %}
#_templateA.html
<i>{% block tags %}{% endblock %}</i>
#_templateB.html
<b>{% block tags %}{{ tags|join:' & ' }}{% endblock %}</b>
#_common.html
{% extends parent_file %}
{% block tags %}
{% if not block.super %} # this does the trick
{{ tags|join:' I ' }}
{% else %}
{{ block.super }}
{% endif %}
{% endblock %}
This allows having HTML templates in _templateA.html and _templateB.html. If the block is left empty, it is filled with default from _common.html, while it can be overriden in _template.
It would be nice to override the block tag to avoid code repetition in _common.html but the following implementation fails on block.super() because of missing context.
#register.tag('overridable_block')
def overridable_block(parser, token):
from django.template.loader_tags import do_block
block = do_block(parser, token)
if block.super():
return block.parent
return block
Haven't found a way past this yet.