Блог на Flask: Реализация рубрик и тегов в постах пользователей # 15

Поделиться
HTML-код
  • Опубликовано: 30 сен 2024
  • В этом уроке мы разберем, как реализовать систему рубрик и тегов в постах пользователей на нашем блоге Flask. Узнаем, как организовать структуру для категоризации и маркировки постов, делая блог более организованным и удобным для пользователей.
    Git проект github.com/Mik... (latest)
    🔗 Связь с автором:
    🌐 Официальный сайт: my-py.ru
    💬 VK: Группа VK python_...
    ✈️ Telegram: Канал Telegram t.me/mikedoitc...
    👾 GitHub: Профиль GitHub github.com/Mik...
    ❤️ Поддержать автора:
    💳Сбербанк: 4274 3200 7161 9756
    🔔 DonationAlerts www.donational...
    🌟Boosty boosty.to/mike...

Комментарии • 6

  • @elnik87
    @elnik87 2 года назад +1

    Я уже всю голову сломал, а как бы сделать, чтоб вывести список всех категорий и при нажатии на одну из них выводить список статей этой категории(ну это вроде понятно).
    Вроде элементарно, а уже два дня не могу получить список категорий для выбора.
    По идее, в вьюхе
    categories = Post.query.order_by(Post.category).all()
    потом в шаблоне
    {% for category in categories %}
    но он выводит все статьи в перемешку и они повторяются.
    Если кому-то не лень, подскажете? За какой-то хренью уже 2 дня сижу.

    • @PythonDevelopment
      @PythonDevelopment  2 года назад +1

      Ну по идее просто categories = Category.query.all()
      Соберем все категории с блога
      Потом выводим список категорий в цикле например, у каждой категории при нажатии формируется маршрут на список статей данной категории. Мне кажется ты по урокам еще не дошел до ролика, где я создавал Категории
      Нужно создать маршрут в котором будем получать строку с названием категории, потом брать посты этой категории и выводить
      @posts.route('/posts//', methods=['GET', 'POST'])
      @login_required
      def category(category_str):
      current_category = Post.query.filter_by(category=category_str).first()
      posts_category = Post.query.filter_by(category=category_str).all()
      return render_template('post/all_posts_category.html', post_category=posts_category,
      current_category=current_category, title='Рубрика ' + category_str)
      Получаем категорию, сбираем все посты данной категории
      Еще раз спасибо за хороший вопрос)) На связи

    • @elnik87
      @elnik87 2 года назад +1

      @@PythonDevelopment Не, это как раз ясно. То, что написал ты работало бы если бы была отдельная модель категории, а у нас же категория - это поле в модели поста.
      Я пытаюсь вывести менюшку, чтобы можно было вывести все категории добавленных постов, при нажатии на которую вызывается функция current_category c всеми постами данной категории.

    • @PythonDevelopment
      @PythonDevelopment  2 года назад +1

      @@elnik87 Так смотри. У Post есть поле category. Есть посты, у них есть категории. Если взять эти посты и про итерироваться по их категориям, то мы получим список категорий постов.
      Типа:
      list_posts = 'Список постов'
      for post in list_posts:
      post.category
      Так? Мы выводим категорию каждого поста.
      Апдейт:
      При нажатии на категорию выводим все посты данной категории:
      Функция current_category принимает строку с именем категории, ищет по имени категории все посты, у которые есть данная категория и выводит их. Тебе нужно создать запрос, в котором ты в модели Post отфильтруешь имя текущей категории, вывести нужно список (коллекцию)
      Примерно:
      current_category = Post.query.filter_by(category = category).all()
      category первое - поле в модели пост
      category второе - имя категории (строка) переданная в функцию просмотра.
      Ты назвал свою функцию def current_user()
      Жду ответа =)

    • @elnik87
      @elnik87 2 года назад +1

      @@PythonDevelopment
      Вот здесь все получается примерно как ты описал, но сколько постов, столько и категорий и они между собой повторяются,
      а нужно просто вывести список категорий, которые записаны в slectfield в формах и записываются в моделях при добавлении поста.
      def posts_categories():
      posts_category = Post.query.filter_by(category=Post.category).all()
      current_category = Post.query.filter_by().first()
      return render_template('post/posts_categories.html', current_category=current_category,
      posts_category=posts_category, categories=categories, title='Направления')
      Ну а дальше перебираешь в шаблонах в цикле.
      Я вроде как-то делал методом тыка через request, но удалил))

    • @PythonDevelopment
      @PythonDevelopment  2 года назад +1

      @@elnik87
      class Tag(db.Model):
      __tablename__ = 'tags'
      id = db.Column(db.Integer, primary_key=True)
      name = db.Column(db.String(20), unique=False, nullable=False)
      post_id = db.Column(db.Integer, db.ForeignKey('posts.id', ondelete='CASCADE'), nullable=False)
      Вроде в группе разобрались что лучше создать модель Category по типу Tag
      а в Post добавишь
      categories = db.relationship('Category', backref='category_post', lazy=True, cascade="all, delete-orphan")
      for category in post.categories:
      category.name
      вот тебе и список
      all_categories = Category.query.all()
      Список всех категорий проекта.
      Можно использовать set() и будут только уникальные категории
      Да и у алхимии думаю рецепты есть на этот счет)
      пока что имеем