MalekBV
@MalekBV

В Django редирект с фильтром?

Встал в ступор. Если на сайте написать /tag/id_tag то тебя перебрасывает на шаблон где написано "Все результаты с тегом #названиетега"

Как сделать чтобы при нажатии кнопки в форме, редиректилось именно на страницу tag/tag_id с нужным нам тегом?

urls.py

path('tag/<int:id>', views.tag_detail, name = "tag_detail_url")


Models.py

class Anime(models.Model):
#code
tags = models.ManyToManyField('Tag', related_name='animes', blank = True)

class Tag(models.model):
name = models.CharField("Тэг", max_length = 30)

def get_absolute_url(self):
    return reverse('animeapp:tag_detail_url', kwargs = {'id': self.id})


Views.py

def tag_detail(request, id):
    tag = Tag.objects.get(id = id)
    return render(request, 'animeapp/tag_detail.html', {'tag': tag})


ШАБЛОН:

<form action="{% url 'animeapp:index' %}" class="form-filter">

          <p class="filter-p"><small class="filter-p">Жанры</small></p>
          <select name="filter_tags" class="home-p" id="filter_tags">
            {% for a in anime %}
              {% for tag in a.tags.all %}
                <option value="{{tag.name}}" class="home-p">{{tag.name}}</option>
              {% endfor %}
            {% endfor %}
          </select>

          <button class="btn btn-primary btn-tag mt-4" type="submit">Найти</button>
        </form>


Нужно чтобы при нажатии на кнопку, показывались теги, но уже с фильтром. Как я понимаю нужно перебросить на url /tag/tag_id с подходящим тегом. Пожалуйста обьясните подробно, я тупой. Спасибо
  • Вопрос задан
  • 61 просмотр
Пригласить эксперта
Ответы на вопрос 1
@szelga
во-первых, в select'е в option value следует вместо {{tag.name}} подставить tag.id.
во-вторых, у формы атрибут action указывает на URL, на который её содержимое должно отправиться после submit'а.
в третьих, оно отправит содержимое формы не в том виде, как оно у вас было задумано. у форм метод по умолчанию GET, так что оно перенаправит на URL вида http://сайт/урл/?filter_tags=значение.

если вы не хотите трогать tag_detail, то придётся через JavaScript перехватывать нажатие кнопки, и вручную перенаправлять на нужный URL.
или же сделайте новый View, который будет принимать только request, самостоятельно парсить значения из request.GET и далее выдавать или не выдавать результат (потребуется обработка ошибок, на случай, если на входе не целое число, или же тег с требуемым id не найден). тогда у формы в action надо будет выставить его.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы