জাজানো optionচ্ছিক url পরামিতি


161

আমার কাছে এর মতো একটি জ্যাঙ্গো ইউআরএল রয়েছে:

url(
    r'^project_config/(?P<product>\w+)/(?P<project_id>\w+)/$',
    'tool.views.ProjectConfig',
    name='project_config'
),

views.py:

def ProjectConfig(request, product, project_id=None, template_name='project.html'):
    ...
    # do stuff

সমস্যাটি হ'ল আমি চাই project_idপ্যারামিটারটি alচ্ছিক হোক।

আমি চাই /project_config/এবং /project_config/12345abdce/সমানভাবে বৈধ ইউআরএল নিদর্শন হতে, যাতে যদি project_id পাস হয়ে যায় তবে আমি এটি ব্যবহার করতে পারি।

যেমনটি এই মুহূর্তে দাঁড়িয়ে আছে, আমি project_idপ্যারামিটার ছাড়াই ইউআরএল অ্যাক্সেস করি তখন আমি একটি 404 পাই ।

উত্তর:


381

বেশ কয়েকটি পন্থা রয়েছে।

একটি হ'ল রেজেক্সে একটি নন-ক্যাপচারিং গ্রুপ ব্যবহার করা: একটি রেজেক্স (?:/(?P<title>[a-zA-Z]+)/)?
জাঙ্গো ইউআরএল টোকেন ptionচ্ছিক তৈরি করা

অন্যটি, অনুসরণ করার সহজ উপায় হ'ল একাধিক নিয়ম যা আপনার প্রয়োজনগুলির সাথে মিলে যায়, সমস্ত একই দৃষ্টিভঙ্গিকে নির্দেশ করে।

urlpatterns = patterns('',
    url(r'^project_config/$', views.foo),
    url(r'^project_config/(?P<product>\w+)/$', views.foo),
    url(r'^project_config/(?P<product>\w+)/(?P<project_id>\w+)/$', views.foo),
)

মনে রাখবেন যে আপনার দৃষ্টিতে আপনাকে URLচ্ছিক ইউআরএল প্যারামিটারের জন্য একটি ডিফল্ট সেট করতে হবে, বা আপনি একটি ত্রুটি পাবেন:

def foo(request, optional_parameter=''):
    # Your code goes here

68
একাধিক-রুটের বিকল্পের জন্য ভোট দিন। +1
বুরহান খালিদ

4
@ ইউজি - আপনি প্রতিটি ইউআরএল প্যাটার্ন নামকরণ করে বিপরীত সমস্যা সমাধান করতে পারবেন না?
টেড

8
আমরা কি প্রতিটি দৃশ্যকে একই নাম দিতে পারি?
ইউজিন

2
@ ইউজি'টোমিটা'টোমিটা আমি জানি, সুতরাং ইউজিনের প্রশ্নের উত্তরটি দুর্ভাগ্যক্রমে, আমরা একই নামে একাধিক দৃষ্টিভঙ্গি রাখতে পারি না, এমনকি যদি আমরা তাদেরকে optionচ্ছিক পরামিতিগুলি পাওয়ার উপায় হিসাবে বাস্তবায়ন করি তবেও।
nnyby

2
@ ইউজিন হ্যাঁ আমরা একই নামের সাথে দুটি ইউআরএল রাখতে পারি, বিপরীত দিকটি নির্ভর করে যেগুলি আর্গসের উপর নির্ভর করে প্রযোজ্য তা গ্রহণ করতে পারে
অর্পিত সিং

37

আপনি নেস্টেড রুট ব্যবহার করতে পারেন

জ্যাঙ্গো <1.8

urlpatterns = patterns(''
    url(r'^project_config/', include(patterns('',
        url(r'^$', ProjectConfigView.as_view(), name="project_config")
        url(r'^(?P<product>\w+)$', include(patterns('',
            url(r'^$', ProductView.as_view(), name="product"),
            url(r'^(?P<project_id>\w+)$', ProjectDetailView.as_view(), name="project_detail")
        ))),
    ))),
)

জ্যাঙ্গো> = 1.8

urlpatterns = [
    url(r'^project_config/', include([
        url(r'^$', ProjectConfigView.as_view(), name="project_config")
        url(r'^(?P<product>\w+)$', include([
            url(r'^$', ProductView.as_view(), name="product"),
            url(r'^(?P<project_id>\w+)$', ProjectDetailView.as_view(), name="project_detail")
        ])),
    ])),
]

এটি অনেক বেশি ডিআরওয়াই (বলুন আপনি productকোয়ার্গের নাম পরিবর্তন করতে চেয়েছিলেন product_id, আপনাকে কেবল লাইন 4 পরিবর্তন করতে হবে এবং এটি নীচের ইউআরএলগুলিকে প্রভাবিত করবে)।

জ্যাঙ্গো ১.৮ এবং তারপরের জন্য সম্পাদিত


1
নেস্টেড ভাল। এছাড়াও, এটি আপনার কোডের বিভিন্ন ইউআরএল বিভাগগুলি আরও স্পষ্টভাবে পৃথক করে (ইনডেন্টের ব্যবহারের কারণে)
প্যাট্রিক

নেস্টেড সমস্যাটি হ'ল যদি আপনার একাধিক alচ্ছিক পরামিতি থাকে, তবে আপনি DRY না হয়ে শেষ করেন, উদাহরণস্বরূপ, 3 টি alচ্ছিক পরামিতি, আপনার 8 টি সম্ভাব্য URL গুলির বিভিন্ন সংমিশ্রণ রয়েছে। আপনাকে প্যারামিটার 1 টি হ্যান্ডেল করতে হবে, প্যারামিটার 1 টি ঘটছে না তবে প্যারামিটার 2 টি ঘটছে এবং পরামিতি 1 এবং 2 ঘটছে না তবে পরামিতি 3 ঘটছে। ইউআরএল অনুচ্ছেদটি একাধিক aচ্ছিক পরামিতিগুলির সাথে একক স্ট্রিংয়ের চেয়ে পড়া আরও শক্ত হবে। Alচ্ছিক প্যারামিটার সাবস্ট্রিংগুলির জন্য প্রতীকী ধ্রুবক ব্যবহার করা এটি পড়া খুব সহজ করে তোলে এবং কেবলমাত্র একটি ইউআরএল থাকবে।
বগাতিয়ার

আমি মনে করি আপনি ঠিক বলেছেন, তবে এটি দরিদ্র ভিউ / ইউআরএল ডিজাইনের ফলাফল। এই উদাহরণটি আরও ভাল হতে পারে।
জ্যাকব ভ্যালেন্টা

'ফ্ল্যাট নেস্টেড থেকে ভাল'
pjdavis

30

এমনকি সহজ ব্যবহার করা হয়:

(?P<project_id>\w+|)

"(A | b)" এর অর্থ a বা b, সুতরাং আপনার ক্ষেত্রে এটি এক বা একাধিক শব্দের অক্ষর (\ w +) বা কিছুই নয়।

সুতরাং এটি দেখতে হবে:

url(
    r'^project_config/(?P<product>\w+)/(?P<project_id>\w+|)/$',
    'tool.views.ProjectConfig',
    name='project_config'
),

9
আমি এই সমাধানটির সরলতা পছন্দ করি তবে সাবধান হন: এটি করার মাধ্যমে দর্শনটি এখনও যুক্তির মান পাবে যা হবে None। এর অর্থ যে আপনি এর জন্য দর্শন স্বাক্ষরে কোনও ডিফল্ট মানের উপর নির্ভর করতে পারবেন না: আপনাকে এটির ভিতরে স্পষ্টভাবে পরীক্ষা করতে হবে এবং ফলস্বরূপ নির্ধারণ করতে হবে।
Anto

এটি আমি খুঁজছিলাম =)
মাইক ব্রায়ান অলিভেরা

3
প্রজেক্ট_আইডি উপস্থিত না থাকলে শেষ স্ল্যাশ সম্পর্কে কী বলা যায়?
আইমখুশ

আপনি শুধু একটি যুক্ত করতে পারেন? স্ল্যাশের পরে বা কেবল স্ল্যাশটিকে প্রজেক্ট_আইডি প্যাটার্নে অন্তর্ভুক্ত করুন
জুয়ান জোসে ব্রাউন

18

জাজানো> ২.০ সংস্করণ :

ইউজির 'টোমিতা' টোমিতার উত্তরটিতে দেওয়া পদ্ধতির সাথে মতামতটি মূলত অভিন্ন । ক্ষতিগ্রস্ত হ'ল বাক্য গঠন:

# URLconf
...

urlpatterns = [
    path(
        'project_config/<product>/',
        views.get_product, 
        name='project_config'
    ),
    path(
        'project_config/<product>/<project_id>/',
        views.get_product,
        name='project_config'
    ),
]


# View (in views.py)
def get_product(request, product, project_id='None'):
    # Output the appropriate product
    ...

ব্যবহার path() আপনিও যা করতে পারেন একটি দৃশ্য অতিরিক্ত আর্গুমেন্ট পাস ঐচ্ছিক আর্গুমেন্ট সহ kwargsধরণের যে dict। এক্ষেত্রে আপনার দর্শনটির জন্য গুণাবলীর জন্য কোনও ডিফল্টের প্রয়োজন হবে না project_id:

    ...
    path(
        'project_config/<product>/',
        views.get_product,
        kwargs={'project_id': None},
        name='project_config'
    ),
    ...

এটি কীভাবে করা হয় তার জন্য এটি অতি সাম্প্রতিক জ্যাঙ্গো সংস্করণে হয় তার জন্য , ইউআরএল প্রেরণের বিষয়ে অফিসিয়াল ডক্সটি দেখুন ।


1
আমি মনে করি আপনি আপনার কোডে প্রোজেক্ট_আইডি এবং প্রোডাক্ট_আইড মিশিয়ে দিয়েছেন, তাই না?
Andreas Bergström

@ আন্ড্রেসবার্গস্ট্রোম এটিকে নির্দেশ করার জন্য অনেক ধন্যবাদ! আপনি এই সম্পর্কে বেশ সঠিক! তাড়াহুড়া করে এটি সংশোধন করা হয়েছে তবে পরে এটির দ্বিতীয়বার দেখতে হবে। আশা করি এখন ঠিক আছে! project_idএকটি ব্যবহার করে ডিফল্ট ক্ষেত্রে পথে এখনও স্থির ছিল dict। এটি আপাতদৃষ্টিতে অদ্ভুত আচরণের দিকে পরিচালিত করতে পারে, যেমন উইলে প্রদত্ত যুক্তিটি dictসর্বদা ব্যবহৃত হবে (যদি আমি সঠিকভাবে মনে করি)।
জোজো

@ জোজো কি এর অর্থ ২ য় বিকল্পের 'প্রকল্প_কনফিগ / ফু / বার' এর অর্থ স্বয়ংক্রিয়ভাবে {'প্রকল্প_আইডি': 'বার'} কাওয়ার্গগুলি দেখা যাবে?
মূল বিবিকিউ সস

9

ভেবেছিলাম আমি উত্তরে কিছুটা যুক্ত করব।

আপনার যদি একাধিক ইউআরএল সংজ্ঞা থাকে তবে আপনার সেগুলির প্রত্যেকের নাম আলাদাভাবে রাখতে হবে। সুতরাং বিপরীত কল করার সময় আপনি নমনীয়তা হারাবেন কারণ একটি বিপরীত একটি পরামিতি আশা করবে যখন অন্যটি করবে না।

Geচ্ছিক প্যারামিটারকে সামঞ্জস্য করার জন্য রেজেক্স ব্যবহার করার আরেকটি উপায়:

r'^project_config/(?P<product>\w+)/((?P<project_id>\w+)/)?$'

2
জ্যাঙ্গো ১.6 এ এটি আমার জন্য ব্যতিক্রম ছুঁড়েছে। আমি এটি থেকে দূরে থাকবReverse for 'edit_too_late' with arguments '()' and keyword arguments '{'pk': 128}' not found. 1 pattern(s) tried: ['orders/cannot_edit/((?P<pk>\\d+)/)?$']
প্যাট্রিক

2

জ্যাঙ্গো = 2.2

urlpatterns = [
    re_path(r'^project_config/(?:(?P<product>\w+)/(?:(?P<project_id>\w+)/)/)?$', tool.views.ProjectConfig, name='project_config')
]

0

ব্যবহার করবেন? ভাল কাজ, আপনি পাইথেক্স পরীক্ষা করতে পারেন । ভিউ পদ্ধতির সংজ্ঞাটিতে প্যারামিটারগুলি * আরগস এবং ** কাওয়ার্গগুলি যুক্ত করতে ভুলবেন না

url('project_config/(?P<product>\w+)?(/(?P<project_id>\w+/)?)?', tool.views.ProjectConfig, name='project_config')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.