u
29 ноября 2019 г. 13:52

Замена картинки при появлении #якоря в адресной строке

Привет всем!
Не могу решить задачку))
Надо сделать замену картинки когда в адресной страке появляется якорь (hash)
Стандартный адрес: site.ru/content/
Адрес с якорем: site.ru/content/#blablabla

  1. {% if что то там == '#blablabla' %}
  2. <meta property="og:image" content="Картинка когда якорь в url" />
  3. {% else %}
  4. <meta property="og:image" content="Стандартная картинка" />
  5. {% endif %}

Попробовал через request.path, но что то не выходит.

2

Вам это нравится? Поделитесь в социальных сетях!

11
Evgenii Legotckoi
  • 29 ноября 2019 г. 15:51
  • (ред.)

Добрый день.

Вам нужно написать шаблонный тег, который будет проверять наличие искомого якоря. Можете проверять просто окончание строки в url

Для того, чтобы написать свой шаблонный тег нужно добваить каталог templatetags, в котором будет файл init .py и файл с названием вашей библиотеки тегов, обычно я называе его также, как приложение в котором находятся данные теги

Такая будет структура

  • my_app/
    • templatetags/
      • init .py
      • my_app.py

my_app.py

  1. from django import template
  2.  
  3. register = template.Library()
  4.  
  5. @register.filter(is_safe=False)
  6. def endswith(value, suffix):
  7. return value.endswith(suffix)

А потом используем его в шаблоне

  1. {% load endswith from my_app %}
  2. {% if request.url|endswith:'#blablabla' %}
  3. <meta property="og:image" content="Картинка когда якорь в url" />
  4. {% else %}
  5. <meta property="og:image" content="Стандартная картинка" />
  6. {% endif %}
    u
    • 29 ноября 2019 г. 16:13

    Server Error (500)
    Что то не заводится((

      Evgenii Legotckoi
      • 29 ноября 2019 г. 16:14

      Server Error (500) - мне это ничего не говорит. у вас может быть там какая угодно ошибка. трейсбек давайте

        Evgenii Legotckoi
        • 29 ноября 2019 г. 16:15
        • (ред.)

        либо ещё перепишите так

        1. {% load endswith from my_app %}
        2. {% if request.path|endswith:'#blablabla' %}
        3. <meta property="og:image" content="Картинка когда якорь в url" />
        4. {% else %}
        5. <meta property="og:image" content="Стандартная картинка" />
        6. {% endif %}

        Я прям сразу так не помню, что там, url или path

          u
          • 29 ноября 2019 г. 16:42

          если request.path, то ничего не меняется
          а если request.url, то 'NoneType' object has no attribute 'endswith'

            Evgenii Legotckoi
            • 29 ноября 2019 г. 16:46

            А как вы вообще рендерите шаблон? у вас request попадает в контекст шаблона? покажите код view

              Evgenii Legotckoi
              • 29 ноября 2019 г. 16:49

              и ещё перепишите так

              1. @register.filter(is_safe=False)
              2. def endswith(value, suffix):
              3. print(value, suffix)
              4. return value.endswith(suffix)

              А потом покажите мне выхлоп print

                u
                • 29 ноября 2019 г. 17:16
                • (ред.)

                None #blablabla

                1. from django.views.generic import TemplateView
                2. from .models import Section
                3. from .models import Article
                4. #from django.core.paginator import Paginator
                5. from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
                6. from django.shortcuts import render
                7. from django.shortcuts import redirect
                8. from django.shortcuts import get_object_or_404
                9.  
                10.  
                11.  
                12.  
                13. from django.utils import timezone
                14. from django.db.models import Sum
                15.  
                16.  
                17.  
                18. # Create your views here.
                19. class Index(TemplateView):
                20. def get(self, request, *args, **kwargs):
                21. context = {}
                22. context['new'] = Article.objects.order_by('-updated')[:10]
                23. return render(request, 'index.html', context=context)
                24.  
                25.  
                26. class SectionView(TemplateView):
                27. def get(self, request, *args, **kwargs):
                28. section = get_object_or_404(Section, slug=self.kwargs['section_url'])
                29. context = {}
                30.  
                31. context['section'] = section
                32. return render(request, 'section.html', context=context)
                33.  
                34.  
                35.  
                36. class ArticleView(TemplateView):
                37. def get(self, request, *args, **kwargs):
                38. article = get_object_or_404(Article, slug=self.kwargs['section_url'])
                39. context = {}
                40.  
                41. context['article'] = article
                42.  
                43. context['related'] = Article.objects.filter(section_id=article.section_id).exclude(id=article.id)[:5]
                44.  
                45. return render(request, 'article.html', context=context)
                46.  
                47.  
                  Evgenii Legotckoi
                  • 29 ноября 2019 г. 17:20
                  • (ред.)

                  так, request должен в щаблоне присутствовать, контекст там должен нормально формироваться

                  None #blablabla

                  А это для request.url?

                  Совсем не помню, в каком случае якоря присуствуют при path

                  Попробуйте в шаблоне так прописать

                  1. {% load endswith from my_app %}
                  2. {% if request.get_full_path|endswith:'#blablabla' %}
                  3. <meta property="og:image" content="Картинка когда якорь в url" />
                  4. {% else %}
                  5. <meta property="og:image" content="Стандартная картинка" />
                  6. {% endif %}
                    u
                    • 29 ноября 2019 г. 18:07

                    Если request.get_full_path, то принт выводит /content/ #blablabla, причем #blablabla не который в адресной строке, а который вот тут {% if request.get_full_path|endswith:'#blablabla' %} - так и должно?

                    request.url выводит None #blablabla
                    request.path тоже выводит /content/ #blablabla

                      Evgenii Legotckoi
                      • 1 декабря 2019 г. 23:29
                      • (ред.)

                      Я очень сильно извиняюсь. Я ошибся по поводу якорей и знака #

                      Дело в том, что часть url с данным знаком вообще не посылается браузером в строну сервера, если вы хотите иметь какой-то идентификатор, то вам нужно посылать url примерно в следующем виде

                      1. /content/?identificator=blablabla

                        Комментарии

                        Только авторизованные пользователи могут публиковать комментарии.
                        Пожалуйста, авторизуйтесь или зарегистрируйтесь
                        • Последние комментарии
                        • Evgenii Legotckoi
                          16 апреля 2025 г. 17:08
                          Благодарю за отзыв. И вам желаю всяческих успехов!
                        • IscanderChe
                          12 апреля 2025 г. 17:12
                          Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
                        • AK
                          1 апреля 2025 г. 11:41
                          Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                        • Evgenii Legotckoi
                          9 марта 2025 г. 21:02
                          К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                        • VP
                          9 марта 2025 г. 16:14
                          Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…