मैं अपने होमपेज का एक लेख सूची दृश्य बनाने की कोशिश कर रहा हूं जो दो तरह से काम करता है।
यहाँ मेरे ऐप url.py का एक हिस्सा है:

path('article_list/<slug:tag>', views.article_list, name='article_list'),

अगर slug: tag '' है, तो मैं इस एक URL को सभी लेखों के मामले और टैग-निर्दिष्ट लेख के मामले को कवर करने वाला बनाना चाहता हूं। यहाँ मेरे view.py का एक हिस्सा है:

def article_list(request, tag):
    if tag == '':
        articles = get_list_or_404(Article)
    else:
        articles = get_list_or_404(Article, tags__name__in=[tag], publish=True)

    context = {
        'tag': tag,
        'articles': articles,
    }
    return render(request, 'blog/article-list.html', context)

Django टेम्पलेट {% url %} टैग के साथ html पर सभी लेख URL को पुनः प्राप्त करने के लिए हर चीज ठीक काम करती है।
मुझे ऐसा कुछ चाहिए:

href="{% url 'article_list' '' %}"

मैं यूआरएल को खाली तर्क के साथ कैसे बना सकता हूं (इस मामले में, खाली स्लग)?

2
Chanwoo Ahn 15 जिंदा 2020, 14:28

1 उत्तर

सबसे बढ़िया उत्तर

इसके काम न करने का कारण यह है कि <slug:…> पथ परिवर्तक [Django-doc] पथ के केवल गैर-रिक्त अनुक्रमों से मेल खाता है। दरअसल, वर्ग परिभाषित किया गया है [गिटहब] के रूप में:

class SlugConverter(StringConverter):
    regex = '[-a-zA-Z0-9_]+'

यहां मूल रूप से दो विकल्प हैं: दो पथ उत्पन्न करें (एक टैग के लिए, एक टैग के बिना), या एक पथ कनवर्टर लागू करें/एक रेगेक्स का उपयोग करें।

विकल्प 1: दो रास्ते

# app/urls.py

from django.urls import path
from app import views

urlpatterns = [
    path('article_list/', views.article_list, name='article_list', kwargs={'slug': ''}),
    path('article_list/<slug:tag>', views.article_list, name='article_list'),
]

विकल्प 2: पथ कनवर्टर लागू करें

पथ कनवर्टर को स्वयं लागू करने के लिए यहां लायक हो सकता है:

# app/converters.py

from django.urls.converters import SlugConverter

class EmptyOrSlugConverter(SlugConverter):
    regex = '[-a-zA-Z0-9_]*'

फिर आप इसे पंजीकृत कर सकते हैं और <emptyorslug:…> पथ कनवर्टर का उपयोग कर सकते हैं:

# app/urls.py

from django.urls import path, register_converter
from app import converters, views

register_converter(converters.EmpotyOrSlug, 'emptyorslug')

urlpatterns = [
    path('article_list/<emptyorslug:tag>', views.article_list, name='article_list'),
]

ध्यान दें कि आप इसके साथ अपने विचार की पठनीयता में थोड़ा सुधार कर सकते हैं:

def article_list(request, tag):
    if not tag:
        articles = get_list_or_404(Article, tags__slug=tag, publish=True)
    else:
        articles = get_list_or_404(Article)

    context = {
        'tag': tag,
        'articles': articles,
    }
    return render(request, 'blog/article-list.html', context)

ध्यान दें कि आप शायद टैग के slug पर फ़िल्टर करना चाहते हैं, न कि name पर।

2
Willem Van Onsem 15 जिंदा 2020, 11:37