Использовать AllAuth от Django с Jinja2?
В огромных усилиях по переходу от шаблонов Django к Jinja2 я столкнулся с некоторыми проблемами. К сожалению (удивительно) я не мог найти много информации по этому вопросу.
Основной проблемой являются теги:
<a class="ui twitter button" href="{% provider_login_url "twitter" method="oauth2" next="/photos/new" %}">
Jinja2 не узнает это:
django.template.exceptions.TemplateSyntaxError: ("Encountered unknown tag 'provider_login_url'.
Должен быть кто-то, кто сумел сделать эту работу. Разве нет простого способа сделать тег шаблона доступным для использования в jinja2? Какой общий способ заставить стороннюю библиотеку работать с jinja2?
2 ответа
Это то, что я использовал (зарегистрируйтесь как func для jinja2), не уверен, что он на 100% работает как нативный тег, но у меня еще не было проблем.
def provider_login_url(request, provider_id, **kwargs):
provider = providers.registry.by_id(provider_id)
query = kwargs
if 'next' not in query:
next_ = request.GET.get('next')
if next_:
query['next'] = next_
else:
if not query['next']:
del query['next']
return provider.get_login_url(request, **query)
Общий метод преобразования тега шаблона django в функцию jinja:
- создайте функцию, эквивалентную тегу шаблона django (например, )
- добавьте функцию в среду jinja, которую вы настроили как среду jinja в настройках django, обычно в
env.globals.update
вызов - см. /questions/25574725/kak-ispolzovat-jinja2-v-kachestve-dvizhka-shablonov-v-django-18/25574739#25574739 для более подробной информации.
Приведенный выше ответ от Basalex раньше работал отлично, ноdjango-allauth>=0.55.0
удаленныйproviders.registry.by_id
поэтому он больше не будет работать, если вы обновите django-allauth до предыдущей версии.
Я все еще ищу «правильный» способ справиться с этим, но, следуя реализации Provider_login_urlpackage_login_url django-allauth , кажется, вы можете сделать что-то вроде:
from allauth.socialaccount.adapter import get_adapter
def provider_login_url(request, provider_id, **kwargs):
provider = get_adapter(request).get_provider(request, provider_id)
... # logic to clean up next, auth_params etc.
return provider.get_login_url(request, **kwargs)
также кажется, что вы можете посмотреть это черезallauth.socialaccount.models.SocialApp
модель
from allauth.socialaccount.models import SocialApp
def provider_login_url(request, provider_id, **kwargs):
provider = SocialApp.objects.get(provider=provider_id).get_provider(request)
... # logic to clean up next, auth_params etc.
return provider.get_login_url(request, **kwargs)