Django 1.10.1 'my_templatetag' không phải là thư viện thẻ đã đăng ký. Phải là một trong số:


81

Tôi muốn có một menu tùy chỉnh tùy thuộc vào nhóm bạn là thành viên. Tôi đang sử dụng Django 1.10.1, allauth, v.v. Khi tôi cố gắng tạo thẻ tạm thời của mình, nó không thành công và nó nói: ¨

TemplateSyntaxError at /
'my_templatetag' is not a registered tag library. Must be one of:
account
account_tags
admin_list
admin_modify
admin_static
admin_urls
cache
i18n
l10n
log
socialaccount
socialaccount_tags
static
staticfiles
tz

'my_templatetag.py' trông giống như sau:

from django import template
from django.contrib.auth.models import Group


register = template.Library()

@register.filter(name='has_group')
def has_group(user, group_name):
    group =  Group.objects.get(name=group_name)
    return group in user.groups.all()

và lỗi đó xuất hiện trong tệp .html của tôi có nội dung:

{%  load my_templatetag %}

Tôi đã thử khởi động lại máy chủ hàng triệu lần, tôi cũng đã cố gắng thay đổi tất cả các tên và ứng dụng là một phần của INSTALLED_APPS trong settings.py. Tôi đang làm gì sai?

Câu trả lời:


130

Bên cạnh việc đặt my_templatetag.pybên trong app_name/templatetags, hãy đảm bảo rằng bạn khởi động lại máy chủ phát triển Django (hoặc đảm bảo nó tự khởi động lại) mỗi khi bạn sửa đổi thẻ mẫu. Nếu máy chủ không khởi động lại, Django sẽ không đăng ký các thẻ.


8
Khởi động lại máy chủ! Cảm ơn rất nhiều!
FMCorz

2
Đối với tôi, đó là __init__.py bị thiếu trong thư mục templatetags ...
zypro

Đây là lý do tại sao tôi yêu stackoverflow
Oto Shavadze

69

Từ django 1.9, bạn có thể tải các thẻ / bộ lọc mới đó trong cài đặt như sau:

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
            'app.apptemplates.load_setting',

        ],

        'libraries':{
            'my_templatetag': 'app.templatetags.my_templatetag',

            }
    },
},

]


2
Cảm ơn rất nhiều vì điều đó :) Không thể làm cho nó hoạt động theo cách khác.
Jonathan

1
Nó cũng làm việc cho tôi. Đây thực sự có thể là câu trả lời được chọn cho câu hỏi. Tôi đang sử dụng phiên bản 2.0 của django trong trường hợp mọi người thắc mắc.
RRC

này cho phép tôi sử dụng thẻ tùy chỉnh cho toàn bộ dự án
dangel

điều này cũng hoạt động nếu bạn cần ghi đè các thẻ tạm thời cụ thể của gói trang web
Nico M

Đây phải là câu trả lời: Tôi sử dụng Django 3.x.
FearlessFuture

35

Đảm bảo rằng bạn không bỏ lỡ bất kỳ bước nào sau đây:

  1. Tạo một thư mục có tên "templatetags" ở cùng cấp với models.py và views.py trong thư mục ứng dụng của bạn

  2. Ứng dụng của bạn phải nằm trong INSTALLED_APPS trong settings.py

  3. Thư mục templatetags phải có __init__.py

  4. Khởi động lại máy chủ django


Đối với tôi, dường như tất cả các ứng dụng của tôi đều yêu cầu chứa apps.py và init .py default_app_config = 'custom_admin.apps.Config'. Nếu không thì Django 1.10 không tải thẻ tạm thời. Tôi không thấy điều này rõ ràng trong tài liệu.
Chris Sattinger

Cảm ơn! Tôi đã quên thêm __ini__.py, nhưng bạn có biết tại sao nó từng hoạt động trong Python3 nhưng không hoạt động trong Python2 không?
Farzad Abdolhosseini

2
Đó là sự khởi động lại luôn giúp tôi! Thx vì đã nhắc tôi vào # 4 ^^
Marc

Điểm # 4 đã giúp tôi "Khởi động lại máy chủ Django", để Django có thể xác định các thẻ mẫu mới.
Lễ hội

21

Trong trường hợp của tôi, vấn đề là, tôi đang sử dụng {% load filter_method_name %}

Tôi đã phải thay đổi thành {% load filename %}

Sau đó tôi phải khởi động lại máy chủ.


2
Khởi động lại máy chủ , một giải pháp đơn giản như vậy cho một lỗi gây phiền nhiễu
Ahmed I. Elsayed

Tên tệp là một cho tôi. Cảm ơn!
ravioli

@ravioli có, một điều thực sự tinh tế để thông báo
Shamsul Arefin Sajib

Cảm ơn bạn! Tôi hoàn toàn bỏ qua điều này, vì tôi đã cho rằng tôi cần tải phương thức chứ không phải bản thân mô-đun.
Majestic Pixel


3

Khởi động lại máy chủ django. Nó hoạt động với tôi sau khi đặt thư mục templatetag trong ứng dụng và template_name.py trong thư mục templatetag.


3

Trong trường hợp nó giúp ích cho ai đó, vấn đề trong trường hợp của tôi là tôi đã sử dụng dấu ngoặc kép khi cố gắng tải (các) thẻ

{%  load 'my_templatetag' %}  <!-- incorrect -->

thay vì

{%  load my_templatetag %}  <!-- correct -->

Lưu ý: extendscần dấu ngoặc kép xung quanh tên tệp nhưng không cầnload


Đây là vấn đề của tôi!
elplatt

3

bạn phải dừng máy chủ phát triển theo cách thủ công và khởi động lại, để Django có thể xác định các thẻ mẫu mới


Câu hỏi này đã có nhiều câu trả lời trên đó, và bài đăng này bổ sung thêm điều gì chưa được nói trong các câu trả lời khác.
Henry Woody

2

Tôi đang sử dụng Django 1.11 và tôi đã gặp vấn đề tương tự. Một số câu trả lời ở đây là đúng, nhưng một số điều có thể bị thiếu. Đây là những gì tôi đã làm:

Trích dẫn một người dùng trước:

Tạo một thư mục có tên "templatetags" ở cùng cấp với models.py và views.py trong thư mục ứng dụng của bạn

Ứng dụng của bạn phải nằm trong INSTALLED_APPS trong settings.py

Thư mục templatetags phải có init .py

Tuy nhiên, trước khi bạn khởi động lại máy chủ Django, hãy thêm phần này vào tệp có chứa các thẻ:

from django import template
register = template.Library()

Sau đó, bạn có thể khởi động lại máy chủ.


Điều này đã hiệu quả với tôi khi tôi sử dụng ' init .py' thay vì 'init.py'.
William

1

Tôi biết điều này hơi cũ, nhưng tôi đã gặp phải vấn đề tương tự ngày hôm nay. Tôi đã tìm thấy giải pháp trong tài liệu: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

Ứng dụng phải chứa thư mục templatetags, ở cùng cấp với models.py, views.py, v.v. Nếu điều này chưa tồn tại, hãy tạo nó - đừng quên tệp __init__.py để đảm bảo thư mục được coi là một gói Python.

Chỉ cần sao chép __init__.py từ một vị trí khác vào thư mục của templatetag mới đã sắp xếp nó.


1

Tôi đã giải quyết vấn đề này bằng cách thêm một thư mục templatestag trong thư mục gốc với một tệp filter.py xác định các bộ lọc của tôi, sau đó tôi điều chỉnh settings.py của mình .

Vui lòng kiểm tra câu trả lời đầy đủ của tôi về vấn đề này trong chủ đề tương tự này


0

đặt my_templatetag.py bên trong app_name / templatetags rồi tạo init .py bên trong app_name / templatetags .. Sau đó, mở terminal trong thư mục dự án, đưa lệnh python management.py shell

từ app_name.templatetags nhập my_templatetag


bên trong thư mục templatetags đóng tệp trống với tên init .py
Kiran Bachhav.

2
Vui lòng chỉnh sửa câu trả lời của bạn để đưa tất cả các chi tiết vào nó và định dạng nó để có thể đọc được (sử dụng định dạng mã nếu thích hợp).
Melebius

0

bạn chỉ cần cắt / xóa mã được viết bên trong (ví dụ: templatetags / home.py) khỏi home.py bạn xóa mã và khởi động lại máy chủ của mình và dán lại mã của bạn vào home.py nó sẽ hoạt động.


0

Yah, Vấn đề này bạn hiện đang gặp phải do phiên bản django cũ hơn Hoặc phức tạp để viết "Khấu hao"

nếu bạn có các loại TAgs này trong tệp mẫu / tệp html của bạn Thay đổi chúng bằng ..

> {{% load staticfiles %} or  {% load admin_static %}, {% load
> admin_static %}}

thay đổi với


{% load static %}

Đi thẳng vào vấn đề .. JUst SImply Thực hiện những việc này Thay thế tất cả những thứ này từ YOur BAse.html / hoặc Bất kỳ loại HTML nào


Bạn có thể sửa lại mô tả lộn xộn này không? Thật khó cho tôi để hiểu lời giải thích của bạn. Vui lòng sửa định dạng mã. Xem Cách trả lời
Gander

-1

lúc đầu hãy dừng server.remove / cắt mã khỏi templatetags / tag.py và viết lại / dán nó. sau đó chạy server.it hoạt động với tôi


2
Việc cắt, rồi dán lại trong mã sẽ giúp ích như thế nào? Nếu bạn thấy lỗi trong mã mẫu của câu hỏi, vui lòng chỉ ra.
Ben
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.