জ্যাঙ্গো ব্যবহার করে কীভাবে বর্তমান ইউআরএল নাম পাবেন?


90

আমাকে বর্তমান ইউআরএল অনুসারে গতিশীলভাবে একটি ইউআরএল তৈরি করতে হবে। {% url %}ট্যাগটি ব্যবহার করা এটির পক্ষে সহজতম উপায়, তবে গতিশীলভাবে নতুনটি উত্পন্ন করার জন্য আমার বর্তমান ইউআরএল নাম প্রয়োজন।

আমি কীভাবে urlconf এর সাথে যুক্ত ইউআরএলটির নামটি বর্তমান দৃশ্যের দিকে নিয়ে যেতে পারি?

সম্পাদনা: আমি জানি যে আমি ম্যানুয়ালি ইউআরএল ব্যবহার করে হ্যান্ডক্রাফ্ট করতে পারি get_absolute_urlতবে আমি এটি এড়াতে চাই কারণ এটি কোনও বক্তৃতার অংশ এবং আমি ইউআরএল তৈরির একমাত্র উপায় প্রদর্শন করতে চাই।

শিক্ষার্থীরা কীভাবে ব্যবহার করতে হয় তা জানে {% url %}। যখন তারা বর্তমানের উপর ভিত্তি করে আরও সম্পূর্ণ url তৈরি করতে হয় তখন তারা সমস্যার মুখোমুখি হয়। সবচেয়ে সহজ উপায় হ'ল {% url %}কিছু বৈচিত্র সহ আবার ব্যবহার করা। যেহেতু আমরা ইউআরএলটির নামকরণ করেছি , তাই ইউআরএলটির নাম কীভাবে পাওয়া যায় যা আমাদের বর্তমান ভিউ বলে।

সম্পাদনা 2: অন্য ব্যবহারের ক্ষেত্রে বেস টেমপ্লেট অনুযায়ী বেস টেম্পলেট অংশ পৃথকভাবে প্রদর্শন করা হয়। এটি করার অন্যান্য উপায় রয়েছে (সিএসএস এবং {% ব্লক% using ব্যবহার করে, তবে ভিউনামটি লিঙ্কটির সাথে মেলে, তবে বেসচটিচএমটিএলের মেনু এন্ট্রি ট্যাগটি সরাতে সক্ষম হওয়ায় খুব ভাল লাগে।


6
একটি টেম্পলেট ট্যাগের মাধ্যমে বর্তমান, পরম ইউআরএল আউটপুট দেওয়ার উপায় অনুসন্ধান করার সময় আমি এই প্রশ্নটি সন্ধান করতে থাকি ... আপনি যদি এটির জন্যও সন্ধান করেন তবে এটি {{ request.get_full_path }}
হ'ল

উত্তর:


134

আমি জানি না কতক্ষণ এই বৈশিষ্ট্যটি জ্যাঙ্গোর অংশ ছিল তবে নীচের নিবন্ধটি দেখায়, দর্শন অনুসারে এটি অর্জন করা যেতে পারে:

   from django.core.urlresolvers import resolve
   current_url = resolve(request.path_info).url_name

আপনার যদি প্রতিটি টেম্পলেটের প্রয়োজন হয় তবে একটি টেমপ্লেট অনুরোধ লিখন উপযুক্ত হতে পারে।

সম্পাদনা করুন: নতুন জাঙ্গো আপডেটের আবেদন করা হচ্ছে

বর্তমান জ্যাঙ্গো আপডেট অনুসরণ করে:

জ্যাঙ্গো ১.১০ ( লিঙ্ক )

django.core.urlresolversমডিউলটি থেকে আমদানি করা তার নতুন অবস্থানের পক্ষে অবহিত করা হয়,django.urls

জ্যাঙ্গো ২.০ ( লিঙ্ক )

django.core.urlresolversমডিউল, তার নতুন অবস্থান পক্ষে মুছে ফেলা হবে django.urls

সুতরাং, সঠিক উপায়টি এরকম:

from django.urls import resolve
current_url = resolve(request.path_info).url_name

কেন? যতদূর আমি আপনার প্রশ্নটি বুঝতে পেরেছি, এর একটি গুরুত্বপূর্ণ অংশটি কীভাবে অর্জন করা যায় "যেহেতু আমরা ইউআরএলটির নামকরণ করেছি, সুতরাং আমাদের কীভাবে ইউআরএলটির বর্তমান নামটি বলা যায় তার নাম কীভাবে পাওয়া যায়।" ...
লুকাস

4
আসলে লুকাশ আমি সেদিন খারাপ ছিলাম এবং আপনার উত্তরটি সম্পূর্ণ নির্বিচারে বাতিল করে দিয়েছিলাম। আমি ক্ষমাপ্রার্থী, কারণ এটি আসলে সঠিক উত্তর। আমি আরও সম্পাদন করতে এটি সম্পাদনা করতে যাচ্ছি।
ই-সন্তুষ্ট

8
resolve()আপনি যদি এটি কোনও ক্যোরি স্ট্রিংটি পাস করেন এবং কেবল একটি 404 উত্থাপন করেন তা সমাধান করতে পারে না get_full_path()the আপনি ব্যবহার করতে হবে resolve(request.path_info)
বুরক ইলিংয়ের

যদি এটি currentইউআরএল না হয় তবে সমাধান করতে হবে, তবে, বলুন, একজন ব্যবহারকারী যার দিকে পুনঃনির্দেশ করতে চলেছেন? এটি সম্পাদন করার আরও সাধারণ উপায় কী? কনলে ওভেনসের উত্তরের একটি সূত্র রয়েছে, তবে আমি যদি চাকাটি জঙ্গোতে ফণার নীচে ইতিমধ্যে উপস্থিত থাকে তবে আমি চাকাটি পুনরায় উদ্ভাবন করব না।
হাসান বৈগ

এটি
আই

109

জ্যাঙ্গো 1.5. হিসাবে, এটি অনুরোধ অবজেক্ট থেকে অ্যাক্সেস করা যেতে পারে

    current_url = request.resolver_match.url_name

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.resolver_match


আমি যখন এটি প্রাসঙ্গিক প্রসেসরে এটি রেখেছি তখন এটি কাজ করেছিল তবে AttributeError: 'WSGIRequest' object has no attribute 'resolver_match'
কনসোলটিতে

4
সমস্ত অনুরোধ মিডলওয়্যারকে কল করার পরেই 'রেজলভার_ম্যাচ' অনুরোধের সাথে যুক্ত করা হয়। ইউআরএলগুলি সমাধান হওয়ার পরে এটি। সুতরাং আপনি কেবল মিডলওয়্যারটি পরে দেখতে পারবেন। (মিডলওয়্যারের প্রক্রিয়া_ভিউ ফাংশন)। এটি অনুরোধ মিডলওয়্যার ফাংশনগুলিতে উপলব্ধ হবে না। (মিডলওয়্যারগুলির প্রক্রিয়া_আবেদনের কাজগুলি)।
ভরথাওয়াজ

.view_nameআপনার যদি প্রয়োজন হয় নেমস্পেস

27

যারা তাদের ইউআরএল নিদর্শনগুলির নাম রাখেন, তবে আপনি অনুরোধটির নেমস্পিড url নামটিতে আগ্রহী হতে পারেন। এই ক্ষেত্রে, জাঙ্গো view_nameপরিবর্তে এটি কল করেছে ।

request.resolver_match.view_name

# return: <namespace>:<url name>

ধন্যবাদ, তবে এটি @ dariusz-niespodziany এর পূর্ববর্তী উত্তরটির চেয়ে অনেকটা দ্বিগুণ, তাই না? stackoverflow.com/a/31931833/1450294
মাইকেল শ্যাপার

4
আপনি যদি urls.pyনামটি স্থান না দিয়ে থাকেন তবে আপনার @ dariusz-niespodziany অবিলম্বে কার্যকর reverse। তবে আপনি যদি নেমস্পেস ব্যবহার করছেন তবে resolver_match.url_nameতা সরাসরি- reverseব্যবহারযোগ্য নয়। এইভাবে আপনাকে নিজের নামের স্থানটি যুক্ত করতে হবে। সুতরাং, নিজে নিজে এটি করার পরিবর্তে, জ্যাঙ্গো ইতিমধ্যে শুরু করার কাজটি সেট করে .view_name
ইয়েও

15

এটি এর মাধ্যমে অর্জন করা যেতে পারে:

    request.resolver_match.url_name

জ্যাঙ্গো> 1.8


4

প্রশ্নের স্পষ্টতা: "একটি দৃষ্টিতে, আপনি এমন একটি urlpattern এর নাম কীভাবে পেয়েছেন যা এটির দিকে নির্দেশ করে, ধরে নিচ্ছে ঠিক এরকম একটি urlpattern রয়েছে" "

বর্ণিত কারণগুলির জন্য এটি আকাঙ্খিত হতে পারে: ভিউয়ের মধ্যে থেকে আমরা একই ভিউতে url পাওয়ার একটি DRY উপায় চাই (আমরা আমাদের নিজস্ব urlpattern নাম জানতে চাই না)।

সংক্ষিপ্ত উত্তর: আপনার ক্লাসটি শেখানোর পক্ষে এটি এতটা সহজ নয়, তবে এটি আপনার জন্য একটি মজাদার বিষয় হতে পারে যে আপনি এক-দু'ঘন্টা সময় করে গিটহাবের কাছে যেতে পারেন।

আপনি যদি সত্যিই এটি করতে চেয়েছিলেন, তবে আপনাকে ভিউ এবং কীওয়ার্ড / মান জোড়াগুলির পরিবর্তে ম্যাচিং প্যাটার্নটি (যা থেকে আপনি প্যাটার্নের নামটি পেতে পারেন) ফেরত দেওয়ার জন্য সমাধান পদ্ধতিটি সাবগ্লাস করতে হবে রেজেজ URL URL রিসলভার এবং সমাধান পদ্ধতিটি পরিবর্তন করতে হবে। http://code.djangoproject.com/browser/django/trunk/django/core/urlololvers.py#L142

তারপরে আপনি একটি ডেকরেটর বা সম্ভবত আরও উপযুক্তভাবে মিডলওয়্যার তৈরি করতে পারেন যা প্যাটার্নটির নাম পেতে এই সাবক্লাসটি ব্যবহার করে এবং সেই মানটি অনুরোধের কোথাও সংরক্ষণ করে যাতে দর্শনগুলি এটি ব্যবহার করতে পারে।

আপনি যদি সত্যিই এটি করতে চান এবং আপনি কিছুটা সমস্যা জুড়ে চলে যান তবে আমাকে জানান এবং আমি সম্ভবত সহায়তা করতে পারি।

আপনার ক্লাসের জন্য, আমি কেবল তাদের ভিউ বা টেমপ্লেটে প্যাটার্নের নামটি হার্ডকোড করব। আমি বিশ্বাস করি এটি এটি করার গ্রহণযোগ্য উপায়।

আপডেট: আমি এ সম্পর্কে যত বেশি চিন্তা করি, আমি দৃশ্যে একটি urlpattern নাম পাওয়ার চেষ্টা করতে আরও নিরুৎসাহিত করব। urlpattern পরামিতিগুলি তারা দেখায় এমন পরামিতিগুলির তুলনায় মোটামুটি স্বতন্ত্র। আপনি যদি একটি নির্দিষ্ট ইউআরএল নির্দেশ করতে চান তবে আপনাকে দেখতে হবে যে urlpattern কীভাবে কাজ করে, কেবল ভিউ কীভাবে কাজ করে না। আপনার যদি urlpattern কীভাবে কাজ করে তা জানতে প্রয়োজন, আপনার পাশাপাশি urlpattern এর নামও জানতে হবে।




1

এটি আপনার প্রশ্ন থেকে কিছুটা অস্পষ্ট, তবে http://docs.djangoproject.com/en/dev/topics/http/urls/ সম্ভবত আপনার পরে কী হবে তার একটি ব্যাখ্যা সরবরাহ করবে।

জ্যাঙ্গো কীভাবে অনুরোধগুলি প্রক্রিয়া করে তা উল্লেখ করার জন্য বিশেষভাবে দরকারী:

যখন কোনও ব্যবহারকারী আপনার জ্যাঙ্গো-চালিত সাইট থেকে কোনও পৃষ্ঠার জন্য অনুরোধ করে, কোন পাইথন কোডটি কার্যকর করতে হবে তা নির্ধারণ করতে সিস্টেমটি অনুসরণ করা অ্যালগরিদম:

  1. জ্যাঙ্গো ব্যবহার করতে মূল URLconf মডিউলটি নির্ধারণ করে। সাধারণত, এটি ROOT_URLCONF সেটিংয়ের মান, তবে আগত HttpRequest অবজেক্টটিতে urlconf (মিডওয়্যার অনুরোধ প্রক্রিয়াকরণ দ্বারা সেট) নামে একটি বৈশিষ্ট্য থাকলে, এর মানটি ROOT_URLCONF সেটিংসের জায়গায় ব্যবহার করা হবে।
  2. জ্যাঙ্গো সেই পাইথন মডিউলটি লোড করে এবং চলক urlpatterns সন্ধান করে। এটি একটি পাইথন তালিকা হওয়া উচিত, ফাংশনটি django.conf.urls.defaults.patterns () দ্বারা ফিরে ফর্ম্যাটে।
  3. জ্যাঙ্গো প্রতিটি ইউআরএল প্যাটার্নটি যথাযথভাবে চালিত হয় এবং অনুরোধ করা URL টির সাথে মেলে এমন প্রথমটিতে থামে।
  4. একবার রেজেক্সগুলির মধ্যে একটি মিলে গেলে, জ্যাঙ্গো প্রদত্ত ভিউটি আমদানি করে এবং কল করে, যা একটি সাধারণ পাইথন ফাংশন। ভিউটি প্রথম আর্গুমেন্ট হিসাবে এইচটিপিআরকিউস্টে পাস হয়ে যায় এবং বাকী আর্গুমেন্ট হিসাবে রেগেক্সে যে কোনও মান ধরা পড়ে।

আপনি যদি পুরো পথ অনুসরণ করে থাকেন তবে আপনি চেষ্টা করতে পারেন:

http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path

আমি আশা করি এটি সহায়তা করে - এটি ইউআরএলকনফ মডিউলটি কীভাবে ব্যবহার করবেন তা নির্দেশ করে এবং আশা করি আপনাকে সঠিক দিক নির্দেশ করতে সহায়তা করবে।


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