Использовать 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:

  1. создайте функцию, эквивалентную тегу шаблона django (например, )
  2. добавьте функцию в среду 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)
Другие вопросы по тегам