Найти - Пользователи
Полная версия: Как сделать проверку в шаблоне?
Начало » Python для новичков » Как сделать проверку в шаблоне?
1 2
Centner
Если я просматриваю пост в нужной категории, кнопка видна, если нет - нет.
В jinja можно прописать условный оператор.
А как обратиться к категории?
py.user.next
Приведи код шаблона и код страницы, которая по этому шаблону получается в браузере.
Centner
Код страницы, просто её исходный код?

Шаблон:
 {% if post.pk %}
    <div class="playpause d-flex">
        <div class="anyContainer">
            <span style="font-size:90%" class="text-black text-center">audio</span>
        <input type="checkbox" value="None" id="playpause" name="check" checked/>
        <label for="playpause" tabindex=1></label>
        </div>
        <a href="{% url 'render_pdf_new' post.pk %}" class='ms-4'>
        <?xml version="1.0" encoding="UTF-8" standalone="no"?>
          <svg xmlns="http://www.w3.org/2000/svg" width="50" height="60" viewBox="0 0 75.320129 92.604164">
            <g transform="translate(53.548057 -183.975276) scale(1.4843)">
            <path fill="#ff2116" d="M-29.632812 123.94727c-3.551967 0-6.44336 2.89347-6.44336 6.44531v49.49804c0 3.55185 2.891393 6.44532 6.44336 6.44532H8.2167969c3.5519661 0 6.4433591-2.89335 6.4433591-6.44532v-40.70117s.101353-1.19181-.416015-2.35156c-.484969-1.08711-1.275391-1.84375-1.275391-1.84375a1.0584391 1.0584391 0 0 0-.0059-.008l-9.3906254-9.21094a1.0584391 1.0584391 0 0 0-.015625-.0156s-.8017392-.76344-1.9902344-1.27344c-1.39939552-.6005-2.8417968-.53711-2.8417968-.53711l.021484-.002z" color="#000" font-family="sans-serif" overflow="visible" paint-order="markers fill stroke" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;solid-opacity:1"/>
            <path fill="#f5f5f5" d="M-29.632812 126.06445h28.3789058a1.0584391 1.0584391 0 0 0 .021484 0s1.13480448.011 1.96484378.36719c.79889772.34282 1.36536982.86176 1.36914062.86524.0000125.00001.00391.004.00391.004l9.3671868 9.18945s.564354.59582.837891 1.20899c.220779.49491.234375 1.40039.234375 1.40039a1.0584391 1.0584391 0 0 0-.002.0449v40.74609c0 2.41592-1.910258 4.32813-4.3261717 4.32813H-29.632812c-2.415914 0-4.326172-1.91209-4.326172-4.32813v-49.49804c0-2.41603 1.910258-4.32813 4.326172-4.32813z" color="#000" font-family="sans-serif" overflow="visible" paint-order="markers fill stroke" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;solid-opacity:1"/>
            <path fill="#ff2116" d="M-23.40766 161.09299c-1.45669-1.45669.11934-3.45839 4.39648-5.58397l2.69124-1.33743 1.04845-2.29399c.57665-1.26169 1.43729-3.32036 1.91254-4.5748l.8641-2.28082-.59546-1.68793c-.73217-2.07547-.99326-5.19438-.52872-6.31588.62923-1.51909 2.69029-1.36323 3.50626.26515.63727 1.27176.57212 3.57488-.18329 6.47946l-.6193 2.38125.5455.92604c.30003.50932 1.1764 1.71867 1.9475 2.68743l1.44924 1.80272 1.8033728-.23533c5.72900399-.74758 7.6912472.523 7.6912472 2.34476 0 2.29921-4.4984914 2.48899-8.2760865-.16423-.8499666-.59698-1.4336605-1.19001-1.4336605-1.19001s-2.3665326.48178-3.531704.79583c-1.202707.32417-1.80274.52719-3.564509 1.12186 0 0-.61814.89767-1.02094 1.55026-1.49858 2.4279-3.24833 4.43998-4.49793 5.1723-1.3991.81993-2.86584.87582-3.60433.13733zm2.28605-.81668c.81883-.50607 2.47616-2.46625 3.62341-4.28553l.46449-.73658-2.11497 1.06339c-3.26655 1.64239-4.76093 3.19033-3.98386 4.12664.43653.52598.95874.48237 2.01093-.16792zm21.21809-5.95578c.80089-.56097.68463-1.69142-.22082-2.1472-.70466-.35471-1.2726074-.42759-3.1031574-.40057-1.1249.0767-2.9337647.3034-3.2403347.37237 0 0 .993716.68678 1.434896.93922.58731.33544 2.0145161.95811 3.0565161 1.27706 1.02785.31461 1.6224.28144 2.0729-.0409zm-8.53152-3.54594c-.4847-.50952-1.30889-1.57296-1.83152-2.3632-.68353-.89643-1.02629-1.52887-1.02629-1.52887s-.4996 1.60694-.90948 2.57394l-1.27876 3.16076-.37075.71695s1.971043-.64627 2.97389-.90822c1.0621668-.27744 3.21787-.70134 3.21787-.70134zm-2.74938-11.02573c.12363-1.0375.1761-2.07346-.15724-2.59587-.9246-1.01077-2.04057-.16787-1.85154 2.23517.0636.8084.26443 2.19033.53292 3.04209l.48817 1.54863.34358-1.16638c.18897-.64151.47882-2.02015.64411-3.06364z"/>
            <path fill="#2c2c2c" d="M-20.930423 167.83862h2.364986q1.133514 0 1.840213.2169.706698.20991 1.189489.9446.482795.72769.482795 1.75625 0 .94459-.391832 1.6233-.391833.67871-1.056548.97958-.65772.30087-2.02913.30087h-.818651v3.72941h-1.581322zm1.581322 1.22447v3.33058h.783664q1.049552 0 1.44838-.39184.405826-.39183.405826-1.27345 0-.65772-.265887-1.06355-.265884-.41282-.587747-.50378-.314866-.098-1.000572-.098zm5.50664-1.22447h2.148082q1.560333 0 2.4909318.55276.9375993.55276 1.4133973 1.6443.482791 1.09153.482791 2.42096 0 1.3994-.4338151 2.49793-.4268149 1.09153-1.3154348 1.76324-.8816233.67172-2.5189212.67172h-2.267031zm1.581326 1.26645v7.018h.657715q1.378411 0 2.001144-.9516.6227329-.95858.6227329-2.5539 0-3.5125-2.6238769-3.5125zm6.4722254-1.26645h5.30372941v1.26645H-4.2075842v2.85478h2.9807225v1.26646h-2.9807225v4.16322h-1.5813254z" font-family="Franklin Gothic Medium Cond" letter-spacing="0" style="line-height:125%;-inkscape-font-specification:'Franklin Gothic Medium Cond'" word-spacing="4.26000023"/>
            </g>
          </svg>
        </a>
    </div>
    {% endif %}
Я сделал проверку чтобы этот код показывался, только на странице поста.
Но мне нужна еще проверка и на категорию.

Вьюшка:
 def post_detail(request, post_slug):
    post = get_object_or_404(Story, slug=post_slug)
    comments = post.comments.filter(active=True)
    if request.method == 'POST':
        comment_form = CommentForm(data=request.POST)
        if comment_form.is_valid():
            new_comment = comment_form.save(commit=False)
            new_comment.post = post
            new_comment.save()
    else:
        comment_form = CommentForm()
    return render(request,
                  'pages/story_detail.html',
                  {'post': post,
                   'comments': comments,
                   'comment_form': comment_form})

И модель:
 class Story(models.Model):
    title = models.CharField(max_length=255, verbose_name='Заголовок')
    slug = models.SlugField(max_length=255, unique=True, db_index=True, verbose_name='URL')
    content = models.TextField(blank=True, verbose_name='Содержание')
    cover = models.ImageField(blank=True, upload_to='photos/%Y/%m', verbose_name='Обложка')
    time_create = models.DateTimeField(default=timezone.now(), null=False, verbose_name='Время создания')
    time_update = models.DateTimeField(auto_now=True)
    is_published = models.BooleanField(default=True, verbose_name='Опубликовано')
    cat = models.ForeignKey('Category', on_delete=models.PROTECT, verbose_name='Категория')
py.user.next
Centner
Код страницы, просто её исходный код?
Код страницы, которая получается в браузере после прохождения через Jinja-шаблон.

Ещё сделай скриншот этой страницы в браузере и нарисуй в виде стрелок и подписей, что считается постом и что считается категорией.

Ты просто говоришь “пост” и “категория”, я тебе так же могу сказать, что вот есть лягушачья лапа, например, и у неё надо определить категорию и коэффициент этой категории. Ты что из этого поймёшь? Какую категорию лягушачьей лапы ты искать будешь? Что это значит, вообще? Слова-то эти есть в словаре и ты их знаешь, но семантика этих слов в данном конкретном выражении тебе неизвестна и ты не можешь понять, о чём вообще речь идёт.

Ещё вот это попробуй запустить
  
def post_detail(request, post_slug):
    post = get_object_or_404(Story, slug=post_slug)
    return repr(dir(post))
Посмотри, что выводит в странице. И скинь сюда.
Centner
Ок, вот сама страница, думаю так будет проще: https://hplove.ru/story/hrebty-bezumiya/

Кнопки по стрелке, генерят pdf и аудио рассказа.
Но они должны быть только в категории “рассказы”.
Для игр и фильмов (другие категории), они, соответственно не нужны.
Поэтому я и хочу добавить такую проверку.
Centner
py.user.next
И скинь сюда.
py.user.next
Вот такую выполни
  
def post_detail(request, post_slug):
    post = get_object_or_404(Story, slug=post_slug)
    raise ValueError('x' + repr(dir(post)) + 'x')
    return None
И результат скинь сюда.

Centner
Ок, вот сама страница, думаю так будет проще: https://hplove.ru/story/hrebty-bezumiya/
Как у тебя различаются страница с рассказом и страница с фильмом? Там даже в ссылке оно показывает story везде. При открытии описания фильма, там должна быть ссылка со словом film.

Вот пример фильма https://hplove.ru/story/from-beyond/ , тут в ссылке слово story, будто это рассказ. Так что тебе надо ссылки сделать правильно. И вообще надо их типизировать, чтобы в историю подавалась переменная post_type со значением story, а в фильм подавалась переменная post_type со значением film.

Это вот в этом месте
  
    return render(request,
                  'pages/story_detail.html',
                  {'post': post,
                   'post_type': 'story',
                   'comments': comments,
                   'comment_form': comment_form})

Либо там внутрь объекта post нужно засунуть свойство post_type. Делать можно по-разному.
А может, оно там уже есть, надо сначала посмотреть через dir, что там есть в этом объекте post.
Centner
Спасибо за помощь.
Никак, честно говоря.
На этапе планирования БД, мне было достаточно, что это будут условно посты разбитые по категориям - текст и картинка.
Нюансы, как обычно, вылезли позже.
Если post_type делать, то менять БД и миграции?
py.user.next
Centner
Если post_type делать, то менять БД и миграции?
Кроме класса Story должен быть ещё и класс Film и все остальные абстракции, которые есть сейчас и которые могут появиться потом. При появлении какого-то понятия код должен быть просто дополнен классом для этого понятия и в коде всё должно подцепиться само и включить это понятие во множество других понятий. То есть для этого код надо написать изначально так. А у тебя он, видимо, на коленке сделан. Поэтому у тебя и истории и фильмы - это одно и то же. А сейчас их надо различить, а ты их различить не можешь.

Так что можешь заново попробовать написать весь проект. Не вносить изменения в существующий, а рядом создать новый проект и начать заполнять его с учётом вновь открывшихся обстоятельств. Может и не получиться у тебя, потому что явно ООП ты не знаешь и не умеешь. Все эти разговоры про ООП, что ООП - это просто три кита и шаблоны проектирования и больше ничего, что class написал и у тебя сразу ООП появилось от этого, - это просто туфта для того, чтобы объяснить себе, что ты можешь ООП делать, но при этом оправдать самому себе, что на самом деле у тебя-то ничего и не получается в итоге по факту, просто куча кода избыточного и никакого профита от него. Поэтому и существует такая позиция у многих, что ООП плохое само по себе и ничего не даёт, просто для красоты существует и просто модная тема и всё. На самом деле, ООП - это сложная тема, её надо долго изучать, потом ещё долго опыт набирать, тренироваться днями и ночами, и только тогда оно начнёт получаться. Так что за недельку ты его не выучишь.

Вот эту выполни
 def post_detail(request, post_slug):
    post = get_object_or_404(Story, slug=post_slug)
    raise ValueError('x' + repr(dir(post.cat)) + '|' + repr(dir(post.cat_id)) + 'x')
    return None
И результат скинь сюда.
Centner
Согласен. Я только учусь. Надо было сразу продумать все, но это уже приходит с опытом.
Я просто раньше работал со smarty.
Там такая проблема решается проще, условно:
 {if $action == 'category' && $category.id == 1}
Код кнопки
{/if}
Мне казалось что в Jinja можно как-то так-же.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB