не может отображать '/' в URL в Django шаблонах - PullRequest
0 голосов
/ 06 августа 2020

Обновление :: Проблема решена. Просто следуйте за парнем ниже.

в моем urls.py

path('', store_view, name='store'),
path('category/<str:category_name>/', category_view, name='category'),

в просмотрах. py

def store_view(request):

  categories = list(Category.objects.all())
  
  context = {     
    'categories': categories,
  }
  return render(request, 'store/store.html', context)


def category_view(request, category_name):

  category = Category.objects.get(name=category_name)
  
  context = {
      'category': category,
  }
  return render(request, 'store/single-category-view.html', context)

в моем шаблоне: store. html, который отображается store_view >>

      {% for item in categories %}
        <a href="{% url 'category' item.name %}">
          {{item.name}}
        </a>
      {% endfor %}

Теперь проблема в столбце категории в моей БД, У меня есть одна категория под названием «Ноутбук / MacBook» . Когда это имя передается на url , там говорится >>

«Обратный вариант для 'category' с аргументами '(' Laptop / MacBook ',)' not не найдено. Попробовано 1 шаблон (ы): ['category / (? P [^ /] +) / $ ']

Но когда я изменил название категории с Ноутбук / MacBook на Ноутбук и MacBook , он работал нормально и не показывал ошибок.

Но я хочу оставить его как есть, 'Ноутбук / MacBook' . Как я могу это сделать ?? и как вы, ребята, справляетесь с этим? что?

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

Попробуйте кодировать и расшифровывать значения вашей БД. Предполагая, что это Python 3:

from urllib.parse import quote, unquote

encoded = quote("Laptop/Macbook", safe="")
decoded = unquote(encoded)

print(encoded, decoded)

Вывод:

Laptop%2FMacbook Laptop/Macbook

При этом ваш маршрут должен принимать правильные параметры.

from django.http import HttpResponse, request
from django.shortcuts import render

def store_view(request):
    name = "Laptop/Macbook"
    return render(request, './store.html', context={"name": name})

def category_view(request, category_name):
    print(category_name)
    return HttpResponse(b"Here we go!")

теги / теги шаблонов .py

from urllib.parse import quote, unquote
from django import template
register = template.Library()

@register.filter(name='encode')
def encode(name):
    return quote(name, safe="")

@register.filter(name='decode')
def decode(name):
    return unquote(name)

Шаблон:

{% load tags %}
<a href="{% url 'category' name|encode %}">
  {{name}}
</a>

Не забудьте добавить в настройках:

'OPTIONS': {
            'libraries':{
                'tags': 'templatetags.tags',
            }
        },
image image
2 голосов
/ 06 августа 2020

При использовании «/» django думает, что вы передаете более одного параметра. Чтобы исправить это, замените str на path в своих URL-адресах следующим образом:

path('', store_view, name='store'),
path('category/<path:category_name>/', category_view, name='category'),

Это позволит django понять, что / не означает, что в вашем URL-адресе есть два отдельных параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...