জাজানোতে কি বিপরীত ()


219

আমি যখন মাঝে মাঝে জ্যাঙ্গো কোড পড়ি তখন আমি কিছু টেম্পলেটগুলিতে দেখি reverse()। এটি কী তা আমি পুরোপুরি নিশ্চিত নই তবে এটি HTTPResponseRedirect এর সাথে একসাথে ব্যবহৃত হয়। এটি কখন এবং কখন reverse()ব্যবহার করার কথা?

কেউ কিছু উদাহরণ দিয়ে উত্তর দিলে ভাল লাগবে ...


26
একটি ইউআরএল প্যাটার্ন দেওয়া, জাজানো সঠিক দর্শনটি চয়ন করতে এবং একটি পৃষ্ঠা উত্পন্ন করতে url () ব্যবহার করে। যে url--> view name,। তবে কখনও কখনও, পুনর্নির্দেশের মতো, আপনাকে বিপরীত দিকে যেতে হবে এবং জ্যাঙ্গোকে একটি দর্শনের নাম দেওয়া দরকার এবং জাজানো উপযুক্ত ইউআরএল তৈরি করে। অন্য কথায় view name --> url,। এটি, reverse()(এটি ইউআরএল ফাংশনের বিপরীত)। এটি কেবল কল করার জন্য এটি আরও স্বচ্ছ বলে মনে হতে পারে generateUrlFromViewNameতবে এটি খুব দীর্ঘ এবং সম্ভবত যথেষ্ট সাধারণ নয়: ডকস.ডজ্যাঙ্গোপ্রজেক্ট
এরিক

4
@ নিউরনেট দুর্দান্ত ব্যাখ্যা, ধন্যবাদ। এই নামটি মনে হয়েছিল (এবং মনে হয়) বিশেষত আমার কাছে অপ্রচল, যা আমি একটি গুরুতর পাপ বলে মনে করি। অযথা অবসন্নতা কে ঘৃণা করে না?
মাইকে রডেন্ট

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

উত্তর:


347

reverse()| জ্যাঙ্গো ডকুমেন্টেশন


ধরা যাক আপনার মধ্যে এটির urls.pyসংজ্ঞা দিয়েছেন:

url(r'^foo$', some_view, name='url_name'),

কোনও টেম্পলেটে আপনি এই urlটিকে এখানে উল্লেখ করতে পারেন:

<!-- django <= 1.4 -->
<a href="{% url url_name %}">link which calls some_view</a>

<!-- django >= 1.5 or with {% load url from future %} in your template -->
<a href="{% url 'url_name' %}">link which calls some_view</a>

এটি হিসাবে রেন্ডার করা হবে:

<a href="/foo/">link which calls some_view</a>

এখন বলুন যে আপনি আপনার views.pyতেমন কিছু করতে চান - যেমন আপনি অন্য /foo/কিছু ভিউতে (না some_view) অন্য কিছু ইউআরএল পরিচালনা করছেন (না ) এবং আপনি ব্যবহারকারীকে পুনঃনির্দেশ করতে চান /foo/(প্রায়শই সফল ফর্ম জমা দেওয়ার ক্ষেত্রে)।

আপনি ঠিক করতে পারেন:

return HttpResponseRedirect('/foo/')

তবে আপনি যদি ভবিষ্যতে ইউআরএল পরিবর্তন করতে চান? আপনাকে নিজের কোডে এটির urls.py এবং তার সমস্ত রেফারেন্স আপডেট করতে হবে। এটি DRY লঙ্ঘন করে (নিজেকে পুনরাবৃত্তি করবেন না) , কেবলমাত্র এক জায়গায় সম্পাদনা করার সম্পূর্ণ ধারণা, যা চেষ্টা করার মতো।

পরিবর্তে, আপনি বলতে পারেন:

from django.urls import reverse
return HttpResponseRedirect(reverse('url_name'))

এটি নামের সাথে সংজ্ঞায়িত ইউআরএলটির জন্য আপনার প্রকল্পে সংজ্ঞায়িত সমস্ত url- এর মাধ্যমে দেখায় url_nameএবং প্রকৃত url দেয় /foo/

এর অর্থ হ'ল আপনি ইউআরএলটিকে কেবল তার nameবৈশিষ্ট্য দ্বারা উল্লেখ করেন - আপনি যদি url নিজেই পরিবর্তন করতে চান বা যে দৃশ্যের দ্বারা বোঝানো হয় আপনি কেবল একটি জায়গায় সম্পাদনা করে এটি করতে পারেন - urls.py


3
এফওয়াইআই, জাজানোতে 1.4 বা তার আগে {{ url 'url_name' }}হওয়া উচিত {% url url_name %}। এটি পরবর্তী জ্যাঙ্গো রিলিজে পরিবর্তিত হবে (1.5) এবং তারপর হওয়া উচিত {% url 'url_name' %}ইউআরএল টেম্পলেটটিগের জন্য
ডকগুলি

1
j_syk ধন্যবাদ - ১.৩ প্রকাশিত হওয়ার পর থেকে আমি ভবিষ্যতে @ @ ইউআরএল ডাউনলোড করছি এবং ভুলে গিয়েছি যে এটি এখনও ডিফল্ট নয়। আমি আমার উত্তর আপডেট করব যাতে এটি অনভিজ্ঞদের ট্রিপ না করে।
স্কাইটিলে

2
স্থির - আমি মনে করি আপনি নিজেরাই অন্য ব্যক্তির জবাবগুলিতে বোবা টাইপগুলি সম্পাদনা করার পক্ষে এটি সম্পূর্ণ গ্রহণযোগ্য বলে বিবেচিত হয়েছেন তাই আপনি যদি আরও কিছুটা লাফিয়ে দেখেন :-)
সাইক্যালে

3
সবচেয়ে সূক্ষ্ম উত্তরগুলির মধ্যে একটি এই সাইটে খুঁজে পেতে পারে।
মানস চতুর্বেদী

1
">>> তবে আপনি যদি ভবিষ্যতে ইউআরএল পরিবর্তন করতে চান তবে কী হবে", এই ধরণের সূক্ষ্মতা যা সময়োপযোগী এবং সময়সীমার 10001% কার্যকর বৈশিষ্ট্যের মতো প্রেরণ করা হয় এবং লোকেরা এটি ব্যবহার করে যেমন এটি ব্যবহার করে ' সেরা অনুশীলন 'এবং গণ্ডগোল ছেড়ে। TBH যদি ভবিষ্যতে কেউ url পরিবর্তন করে আপনি কেবল একটি বিশ্বব্যাপী অনুসন্ধান-প্রতিস্থাপন করেন। এমনকি এই সমাধানটি (url_name ব্যবহার করুন) সমস্যার ঝুঁকিতে পড়ে 'যদি আপনি ভবিষ্যতে url_name পরিবর্তন করতে চান তবে কি হবে?' জ্যাঙ্গোতে 5 বছরেরও বেশি সময় ধরে কোডিং করা হয়েছে এবং এখনও প্রয়োজনীয়তা পূরণ করতে পারেনি url_reverse। এই জাতীয় প্রতিকূলতার সাথে মোকাবিলা করার সর্বোত্তম উপায় হ'ল সেগুলি ব্যবহার করতে অস্বীকার করা।
নেহেম

10

এটি একটি পুরানো প্রশ্ন, তবে এখানে এমন কিছু যা কারও সাহায্য করতে পারে।

অফিসিয়াল ডক্স থেকে:

জ্যাঙ্গো ইউআরএল বিপরীতকরণের জন্য সরঞ্জামগুলি সরবরাহ করে যা বিভিন্ন স্তরগুলির সাথে মেলে যেখানে URL গুলি প্রয়োজন: টেম্পলেটগুলিতে: url টেমপ্লেট ট্যাগ ব্যবহার করে। পাইথন কোডে: বিপরীত () ফাংশন ব্যবহার করে। জ্যাঙ্গো মডেল উদাহরণগুলির URL গুলি পরিচালনার সাথে সম্পর্কিত উচ্চ স্তরের কোডে: get_absolve_url () পদ্ধতি।

যেমন। টেমপ্লেটগুলিতে (ইউআরএল ট্যাগ)

<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>

যেমন। পাইথন কোডে ( reverseফাংশনটি ব্যবহার করে )

return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

1
পূর্ণ বিবরণ বসের প্রয়োজন
জব

ওপি বিশেষভাবে উল্লেখ করেছেন যে তিনি ডক্সটি পড়েছেন, তার ডকস থেকে কেবল অনুলিপি / পেস্ট নয়, তার ব্যাখ্যা প্রয়োজন।
রুসিআই

8

বর্তমান উত্তর ব্যাখ্যা এ একটি মহান কাজ করেছেন কি এইreverse() ফাংশনটি ।

যাইহোক, আমি আশা করেছি যে আমার উত্তরটি কেন অন্যরকম আলো ছড়িয়ে দিয়েছে : কেন reverse()আরও সরল, যুক্তিযুক্তভাবে আরও বেশি পাইথোনিক পদ্ধতির পরিবর্তে টেমপ্লেট-ভিউ বাইন্ডিংয়ে ব্যবহার করুন এবং এই জনপ্রিয়তার জন্য কিছু বৈধ কারণ কী তা "এর মাধ্যমে পুনঃনির্দেশ করুন " reverse() জ্যাঙ্গো রাউটিং যুক্তিতে প্যাটার্ন "।

একটি মূল সুবিধা হ'ল ইউআরএলটির বিপরীত নির্মাণ, যেমন অন্যরা উল্লেখ করেছেন। ঠিক কীভাবে আপনি {% url "profile" profile.id %}আপনার অ্যাপ্লিকেশনটির ইউআরএল কনফিগারেশন ফাইল থেকে ইউআরএল তৈরি করতে ব্যবহার করবেন: যেমনpath('<int:profile.id>/profile', views.profile, name="profile")

তবে ওপি যেমন উল্লেখ করেছে, এর ব্যবহারের reverse()সাথে সাধারণভাবে ব্যবহারও মিলিত হয় HttpResponseRedirect। কিন্তু কেন?

এটি কী তা আমি পুরোপুরি নিশ্চিত নই তবে এটি HTTPResponseRedirect এর সাথে একসাথে ব্যবহৃত হয়। এই বিপরীতটি (কখন) ব্যবহার করার কথা?

নিম্নলিখিত বিবেচনা করুন views.py:

from django.http import HttpResponseRedirect
from django.urls import reverse

def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected = question.choice_set.get(pk=request.POST['choice'])
    except KeyError:
        # handle exception
        pass
    else:
        selected.votes += 1
        selected.save()
        return HttpResponseRedirect(reverse('polls:polls-results',
                                    args=(question.id)
        ))

এবং আমাদের ন্যূনতম urls.py:

from django.urls import path
from . import views

app_name = 'polls'
urlpatterns = [
    path('<int:question_id>/results/', views.results, name='polls-results'),
    path('<int:question_id>/vote/', views.vote, name='polls-vote')
]

ইন vote()ফাংশন, আমাদের কোড elseব্লক ব্যবহার reverseসহ HttpResponseRedirectনিম্নলিখিত প্যাটার্ন:

HttpResponseRedirect(reverse('polls:polls-results',
                                        args=(question.id)

এটি প্রথম এবং সর্বাগ্রে, এর অর্থ হ'ল আমাদের ইউআরএলকে হার্ডকোড করতে হবে না (ডিআরওয়াই নীতির সাথে সামঞ্জস্যপূর্ণ) তবে আরও গুরুত্বপূর্ণভাবে, reverse()যুক্তিগুলি থেকে args=(question.id)প্যাকযুক্ত মানগুলি হ্যান্ডেল করে ইউআরএল স্ট্রিংগুলি তৈরি করার একটি দুর্দান্ত উপায় সরবরাহ করে ( ইউআরএল কনফিগ দ্বারা পরিচালিত)। মনে করা questionহয়েছে এমন একটি বৈশিষ্ট্য idরয়েছে যার মধ্যে মান রয়েছে 5, এর পরে নির্মিত ইউআরএলটি হ'ল reverse():

'/polls/5/results/'

সাধারণ টেমপ্লেট-ভিউ বাইন্ডিং কোডটিতে আমরা ব্যবহার করি HttpResponse()বা render()তারা সাধারণত কম বিমূর্ততা জড়িত: একটি দৃশ্য ফাংশন একটি টেমপ্লেট ফিরে:

def index(request):
    return render(request, 'polls/index.html') 

তবে পুনঃনির্দেশের অনেক বৈধ ক্ষেত্রে আমরা সাধারণত প্যারামিটারগুলির তালিকা থেকে URL তৈরির বিষয়ে যত্নশীল। এর মধ্যে যেমন রয়েছে:

  • POSTঅনুরোধের মাধ্যমে এইচটিএমএল ফর্ম জমা দেওয়া
  • ব্যবহারকারী লগইন পোস্ট-বৈধতা
  • JSON ওয়েব টোকেনের মাধ্যমে পাসওয়ার্ড পুনরায় সেট করুন

এগুলির মধ্যে বেশিরভাগটি পুনঃনির্দেশের কিছু ফর্ম এবং প্যারামিটারগুলির একটি সেট দিয়ে নির্মিত URL টি জড়িত। আশা করি এটি উত্তরগুলির ইতিমধ্যে সহায়ক থ্রেডে যুক্ত হবে!


4

ফাংশনটি শুকনো নীতিটিকে সমর্থন করে - এটি নিশ্চিত করে যে আপনি আপনার অ্যাপ্লিকেশন জুড়ে হার্ড কোড url করবেন না। একটি ইউআরএল এক জায়গায় সংজ্ঞায়িত করা উচিত, এবং কেবলমাত্র এক জায়গায় - আপনার ইউআরএল কনফ। এর পরে আপনি সত্যিই কেবল সেই তথ্যটি উল্লেখ করছেন।

reverse()আপনাকে কোনও পৃষ্ঠার ইউআরএল দেওয়ার জন্য ব্যবহার করুন , না হয় দেখার পাথ দেওয়া হয় অথবা আপনার ইউআরএল কনফ থেকে পাতার নাম পরামিতি। আপনি এটি এমন ক্ষেত্রে ব্যবহার করবেন যেখানে এটির সাথে টেমপ্লেটে এটি করার কোনও অর্থ নেই {% url 'my-page' %}

আপনি এই কার্যকারিতাটি ব্যবহার করতে পারেন এমন অনেকগুলি সম্ভাব্য স্থান রয়েছে। দর্শকদের পুনর্নির্দেশের সময় (প্রায়শই কোনও ফর্মের সফল প্রক্রিয়াজাতকরণের পরে) - আমি এটি ব্যবহার করেছি এমন একটি স্থানে আমি এটি ব্যবহার করেছি -

return HttpResponseRedirect(reverse('thanks-we-got-your-form-page'))

টেমপ্লেট ট্যাগ লেখার সময় আপনি এটি ব্যবহার করতে পারেন।

আমি অন্য সময় ব্যবহার করেছি reverse()মডেল উত্তরাধিকার সঙ্গে। আমার পৈতৃক মডেলটিতে একটি তালিকাভিউ ছিল, তবে parent পিতামাতাদের যে কোনও একটি থেকে এটি সম্পর্কিত শিশু অবজেক্টের ডেটেলভিউতে যেতে চেয়েছিলাম। আমি get__child_url()পিতামাতার সাথে একটি ফাংশন সংযুক্ত করেছি যা কোনও সন্তানের অস্তিত্ব সনাক্ত করে এবং এর ডিটেলভিউয়ের ইউআরএল ব্যবহার করে ফিরিয়ে দিয়েছে reverse()


4

তার জন্য একটি ডক আছে

https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls

এটি কোনও প্রদত্ত দর্শনের জন্য একটি URL তৈরি করতে ব্যবহার করা যেতে পারে

প্রধান সুবিধাটি হ'ল আপনি নিজের কোডে হার্ড কোড রুট করবেন না।


2

বিদ্যমান উত্তরগুলি বেশ স্পষ্ট। কেবলমাত্র কেন এটি বলা হয় তা আপনি জানেন না reverse: এটি একটি ইউআরএল নামের একটি ইনপুট নেয় এবং প্রকৃত ইউআরএল দেয় যা প্রথমে একটি ইউআরএল থাকার পরে বিপরীত হয় এবং পরে এটি একটি নাম দেয়।


1
টিউটোরিয়াল (জ্যাঙ্গো গার্লস) থেকে জ্যাঙ্গো শিখছি। এটি খাড়া শেখার বক্ররেখা। আমি মনে করি এই ফাংশনটির নাম হতাশাজনক: কোনও যোগ্যতা ছাড়াই "রিজার্ভ" খুব জোরালোভাবে একটি তালিকা বা স্ট্রিং সংরক্ষণ করার পরামর্শ দেয়, যার সাথে স্পষ্টত কিছুই করার নেই।
মাইকে রডেন্ট

@ মিকেরোডেন্ট আমি আপনার সাথে পুরোপুরি একমত এছাড়াও, এই উত্তরগুলির মধ্যে কোনওটিই ফাংশনটিকে বিপরীত কেন বলা হয় তা ব্যাখ্যা করে না । এটি এমন খারাপ নাম ইমো।
সোহম দঙ্গারগাঁওকার

1

বিপরীত () জ্যাঙ্গো ডিআরওয়াই নীতিটি মেনে চলার জন্য ব্যবহৃত হয় অর্থাৎ আপনি যদি ভবিষ্যতে ইউআরএল পরিবর্তন করেন তবে আপনি সেই ইউআরএলটিকে বিপরীত (urlname) ব্যবহার করে উল্লেখ করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.