मैं urls.py में एक सामान्य urlpatterns प्रविष्टि लिखने का प्रयास कर रहा हूं जो हार्डकोड की गई प्रविष्टियों का स्थान लेगी, जैसा कि नीचे दिया गया है:

path('apple/', RedirectView.as_view(url='/apple/abc/'), name='apple_redirect'),
path('orange/', RedirectView.as_view(url='/orange/def/'), name='orange_redirect'),
path('banana/', RedirectView.as_view(url='/banana/ghi/'), name='banana_redirect'),  

फलों नामक मॉडल में निम्न डेटा होता है:

    name = 'apple'
    url = 'apple/abc/'

    name = 'orange'
    url = '/orange/def/'

    name = 'banana'
    url = '/banana/ghi/'

फलों मॉडल में नई प्रविष्टि जोड़े जाने की स्थिति में मैं किसी अन्य पथ को मैन्युअल रूप से जोड़ने की आवश्यकता से बचना चाहूंगा।

0
Luke G 8 जिंदा 2019, 00:43

2 जवाब

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

आपको यूआरएल परम को पकड़ना चाहिए और इसे इस तरह अपने विचार में पास करना चाहिए

from django.shortcuts import redirect, get_object_or_404

def fruit_redirect_view(request, url_path):
    fruit = get_object_or_404(Fruit, name=url_path)
    return redirect(fruit.url)

इसलिए यदि ऐसे नाम वाला फल मौजूद है, तो अनुरोध को फल के url पर पुनर्निर्देशित किया जाएगा, अन्यथा 404 त्रुटि हो जाएगी

2
Alex C 8 जिंदा 2019, 02:20

यदि आप RedirectView का उपयोग करना चाहते हैं, तो आप इसे उपवर्गित कर सकते हैं और get_redirect_url.

class FruitRedirectView(RedirectView):
    def get_redirect_url(self):
        fruit = get_object_or_404(Fruit, name=self.kwargs['fruit'])
        return fruit.url

फिर अपने अलग-अलग फलों के URL पैटर्न को इसके साथ बदलें:

path('<slug:fruit>/', FruitRedirectView.as_view(), name='fruit_redirect'),

ध्यान दें कि आपको यहां RedirectView का उपयोग करने की आवश्यकता नहीं है। एलेक्स सी के विचार को समझना आसान है, खासकर यदि आप Django के सामान्य विचारों से परिचित नहीं हैं।

ध्यान दें कि एक बार जब आप <slug:fruit>/ जोड़ लेते हैं, तो दृश्य किसी भी ऐसे फल के लिए 404 त्रुटि उत्पन्न करेगा जो डेटाबेस में नहीं है। यह आपके URL पैटर्न में apple/ और orange/ के समय से थोड़ा अलग है - उस स्थिति में, Django आपके URL पैटर्न की सूची के नीचे एक पैटर्न का मिलान करने में सक्षम हो सकता है।

1
Alasdair 8 जिंदा 2019, 02:07