জ্যাঙ্গো অ্যাডমিনে কীভাবে কোনও পাঠ্য ফিল্টার যুক্ত করা যায়

নির্দিষ্ট ক্ষেত্রগুলির জন্য টেক্সট ফিল্টারগুলির সাথে জ্যাঙ্গো অনুসন্ধান কীভাবে প্রতিস্থাপন করবেন

আরও ভাল পড়ার অভিজ্ঞতার জন্য এই নিবন্ধটি আমার ওয়েবসাইটে পড়ুন।

একটি নতুন জ্যাঙ্গো অ্যাডমিন পৃষ্ঠা তৈরি করার সময়, বিকাশকারী এবং সমর্থনকারী ব্যক্তির মধ্যে একটি যৌথ কথোপকথনের শব্দটি এরকম হতে পারে:

বিকাশকারী: আরে, আমি একটি নতুন লেনদেন প্রশাসনের পৃষ্ঠা যুক্ত করছি। আপনি কীভাবে লেনদেনের সন্ধান করতে চান তা আমাকে বলতে পারেন?
সমর্থন: অবশ্যই, আমি সাধারণত কেবল ব্যবহারকারীর নামটি অনুসন্ধান করি।
বিকাশকারী: দুর্দান্ত
অনুসন্ধানের ক্ষেত্রগুলি = (ব্যবহারকারীর নাম,)
আরেকটা জিনিস?
সমর্থন: আমি মাঝে মাঝে ব্যবহারকারীর ইমেল ঠিকানাটিও সন্ধান করতে চাই।
বিকাশকারী: ঠিক আছে।
অনুসন্ধানের ক্ষেত্রগুলি = (ব্যবহারকারীর নাম, ব্যবহারকারী ইমেল,)
সমর্থন: এবং অবশ্যই প্রথম এবং শেষ নাম।
বিকাশকারী: হ্যাঁ, ঠিক আছে।
অনুসন্ধান_ফিল্ডস = (ব্যবহারকারীর নাম, ব্যবহারকারীর ইমেল, ব্যবহারকারী_প্রথম_নাম, ব্যবহারকারীর_স্তানা_নাম,)
এইটাই কি সেইটা?
সমর্থন: মাঝে মাঝে আমাকে পেমেন্ট রসিদ নম্বরটি সন্ধান করতে হয়।
বিকাশকারী: ঠিক আছে।
অনুসন্ধান_ফিল্ডস = (ব্যবহারকারীর নাম, ব্যবহারকারীর ইমেল, ব্যবহারকারী_প্রথম_নাম, ব্যবহারকারীর_স্তানা নাম, অর্থ প্রদানের নথি_সংখ্যক,)
আরেকটা জিনিস?
সমর্থন: কিছু গ্রাহক তাদের চালান প্রেরণ করে এবং প্রশ্ন জিজ্ঞাসা করে, তাই আমিও চালানের নম্বরটি সন্ধান করি।
বিকাশকারী: ফাইন!
অনুসন্ধান_ফিল্ডস = (ব্যবহারকারীর নাম, ব্যবহারকারীর ইমেল, ব্যবহারকারী_প্রথম_নাম, ব্যবহারকারীর_স্তানা নাম, অর্থ প্রদানের নথি_সংখ্যার, চালান_ইনভয়েস নম্বর,)
ঠিক আছে তুমি কি নিশ্চিত?
সমর্থন: বিকাশকারীরা কখনও কখনও এই দীর্ঘ র্যান্ডম স্ট্রিংগুলি ব্যবহার করে আমাদের কাছে টিকিট ফরোয়ার্ড করে। আমি কখনই সত্যই নিশ্চিত নই যে তারা কী তাই আমি কেবল সন্ধান করি এবং সর্বোত্তম আশা করি।
বিকাশকারী: এগুলিকে ইউআইডি বলা হয়।
অনুসন্ধান_ফিল্ডস = (ব্যবহারকারীর নাম, ব্যবহারকারীর ইমেল, ব্যবহারকারী_প্রথম_নাম, ব্যবহারকারীর_স্তানা নাম, অর্থ প্রদানের নথি_সংখ্যার, চালান_ইনভয়েস নম্বর, ইউআইডি, ব্যবহারকারী_উইড, পেমেন্ট__উইড, চালান__ইউইড,)
তাহলে কি তাই?
সমর্থন: হ্যাঁ, আপাতত ...

অনুসন্ধান ক্ষেত্রগুলির সাথে সমস্যা

জ্যাঙ্গো অ্যাডমিন অনুসন্ধানের ক্ষেত্রগুলি দুর্দান্ত - অনুসন্ধানের ক্ষেত্রগুলিতে একগুচ্ছ ক্ষেত্র নিক্ষেপ করুন এবং বাকীটি জ্যাঙ্গো করবে।

সার্চ বক্সের সমস্যা শুরু হয় যখন খুব বেশি থাকে।

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

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

জ্যাঙ্গো এবং ব্যবহারকারীর মধ্যে ব্যবধান পূরণ করা

আমরা কীভাবে একাধিক অনুসন্ধান ক্ষেত্র তৈরি করতে পারি সে সম্পর্কে চিন্তাভাবনা করেছি - প্রতিটি ক্ষেত্র বা ক্ষেত্রের গ্রুপের জন্য একটি। আমরা ভেবেছিলাম যে ব্যবহারকারী যদি ইমেল বা ইউআইডি অনুসন্ধান করতে চান তবে অন্য কোনও ক্ষেত্র সন্ধানের দরকার নেই।

কিছু চিন্তাভাবনার পরে, আমরা একটি সমাধান নিয়ে এসেছি - একটি কাস্টম সিম্পললিস্ট ফিল্টার:

  • লিস্টফিল্টার কাস্টম ফিল্টার যুক্তিকে সক্ষম করে।
  • লিস্টফিলারের একটি কাস্টম টেম্পলেট থাকতে পারে।
  • জাজানো ইতিমধ্যে বেশ কয়েকটি তালিকা-ফিল্টারগুলি সমর্থন করে।

আমরা এটি দেখতে এটি চেয়েছিলেন:

একটি পাঠ্য তালিকার ফিল্টার

ইনপুট ফিল্টার প্রয়োগ করুন

আমরা পছন্দগুলির পরিবর্তে পাঠ্য প্রবেশের সাথে একটি তালিকা ফিল্টার রাখতে চাই।

আমরা বাস্তবায়নে যাওয়ার আগে, আসুন শেষে শুরু করা যাক। মডেলএডমিনে আমরা আমাদের ইনপুটফিল্টারটি এভাবে ব্যবহার করতে চাই:

শ্রেণি UIDFilter (ইনপুটফিল্টার): প্যারামিটার_নাম = 'uid' শিরোনাম = _ ('ইউআইডি') ডিফ ক্যোয়ারীসেট (স্ব, অনুরোধ, ক্যোরিসেট): যদি self.value () কোনটিই নয়: uid = self.value ()
রিটার্ন ক্যোয়ারেটস.ফিল্টার (কিউ (ইউআইডি = ইউইডি) | কিউ (পেমেন্ট_উইডি = ইউআইডি) | কিউ (ইউজার_ইউডি = ইউআইডি))

এবং এটি মডেলএডমিনে অন্য যে কোনও তালিকা ফিল্টারের মতো ব্যবহার করুন:

ট্রানজেকশনএডমিন ক্লাস (অ্যাডমিন.মোডেলএডমিন): ... লিস্ট_ফিল্টার = (ইউইউডিফিল্টার,) ...
  • আমরা ইউআইডি ফিল্ডের জন্য একটি কাস্টম ফিল্টার তৈরি করব - ইউআইডিফিল্টার।
  • আমরা URL এ প্যারামিটারের নামটি ইউআইডিতে সেট করি। ইউআইডি দ্বারা ফিল্টার করা একটি ইউআরএল দেখতে এই জাতীয় দেখাচ্ছে: / অ্যাডমিন / অ্যাপ / লেনদেন? ইউআইডি =
  • যদি ব্যবহারকারী কোনও ইউআইডি প্রবেশ করে থাকে তবে কোনও লেনদেন, অর্থ প্রদান বা ব্যবহারকারী ইউআইডি অনুসন্ধান করা হয়।

এখনও পর্যন্ত এটি সাধারণ কাস্টম লিস্টফিলারের সাথে মিল রয়েছে।

আমরা কী চাই তার আরও ভাল ধারণা পাওয়ার পরে, আসুন আমরা আমাদের ইনপুটফিলারটি প্রয়োগ করি:

ইনপুটফিল্টার শ্রেণি (অ্যাডমিন.সিম্পল্লিস্ট ফিল্টার): টেমপ্লেট = 'অ্যাডমিন / ইনপুট_ফিল্টার.html'
ডিফ-লুকআপস (স্ব, অনুরোধ, মডেল_অ্যাডমিন): # ডামি, ফিল্টারটি প্রদর্শনের জন্য প্রয়োজনীয়। রিটার্ন (())

আমরা সরললিস্ট ফিল্টার থেকে উত্তরাধিকারী এবং টেমপ্লেট ওভাররাইট করি। আমাদের কোনও অনুসন্ধান নেই এবং আমরা টেমপ্লেটটি নির্বাচনের পরিবর্তে কোনও পাঠ্য এন্ট্রি উপস্থাপন করতে চাই:

// টেমপ্লেট / অ্যাডমিন / ইনপুট_ফিল্টার.html
18% i18n% load লোড করুন

filter% ফিল্টার_সামগ্রী = শিরোনাম% with সহ ব্লকট্রান্স

আমরা জাঙ্গোর বিদ্যমান তালিকা ফিল্টারটিকে স্থানীয় করার জন্য অনুরূপ একটি মার্কআপ ব্যবহার করছি। টেমপ্লেটটি জিইটি অ্যাকশন এবং পরামিতিগুলির জন্য একটি পাঠ্য ক্ষেত্র সহ একটি সাধারণ ফর্ম রেন্ডার করে। এই ফর্মটি জমা দেওয়া হলে প্যারামিটারের নাম এবং মূল্য জমা দেওয়ার সাথে URL আপডেট করা হবে।

অন্যান্য ফিল্টারগুলির সাথে ভাল খেলুন

এখনও অবধি, অন্য ফিল্টার না থাকলে কেবল আমাদের ফিল্টারটি কাজ করে। আমরা যদি অন্য ফিল্টারগুলির সাথে ভাল খেলতে চাই তবে আমাদের সেগুলি আমাদের আকারে নিতে হবে। এটি করার জন্য, আমাদের তাদের মানগুলি নির্ধারণ করতে হবে।

তালিকা ফিল্টারটিতে "নির্বাচন" নামে আরও একটি ফাংশন রয়েছে। ফাংশনটি এমন একটি পরিবর্তন তালিকা অবজেক্ট গ্রহণ করে যা বর্তমান দর্শন সম্পর্কে সমস্ত তথ্য ধারণ করে এবং পছন্দের তালিকাকে দেয়।

আমাদের কোনও পছন্দ নেই, সুতরাং আমরা কোয়েরি সেটটিতে প্রয়োগ করা সমস্ত ফিল্টারগুলি বের করতে এবং টেমপ্লেটের জন্য এগুলিকে উপলভ্য করে তুলতে এই বৈশিষ্ট্যটি ব্যবহার করতে যাচ্ছি:

ইনপুটফিল্টার শ্রেণি (অ্যাডমিন.সিম্পল্লিস্ট ফিল্টার): টেমপ্লেট = 'অ্যাডমিন / ইনপুট_ফিল্টার.html'
ডিফ-লুকআপস (স্ব, অনুরোধ, মডেল_আডমিন): # ডামি, ফিল্টারটি প্রদর্শনের জন্য প্রয়োজনীয়। রিটার্ন (())
পছন্দগুলি (স্ব, পরিবর্তন তালিকা): # কেবলমাত্র "সমস্ত" বিকল্পটি গ্রহণ করুন। all_choice = পরের (সুপার () তালিকা (পরিবর্তন তালিকা)) all_choice ['ক্যোয়ারী_পার্টস'] = ((কে, ভি) জন্য কে, ভি ইন চেঞ্জলিস্ট.জেট_ফিলার_প্রেমস ()। আইটেম () কে যদি!

ফিল্টারগুলি অন্তর্ভুক্ত করতে আমরা প্রতিটি প্যারামিটারের জন্য একটি লুকানো ইনপুট ক্ষেত্র যুক্ত করি:

// টেমপ্লেট / অ্যাডমিন / ইনপুট_ফিল্টার.html
18% i18n% load লোড করুন
filter% ফিল্টার_শিরোনাম সহ% ব্লকট্রান্স = শিরোনাম%} দ্বারা {{ফিল্টার_শিরোনাম}} {% এন্ডব্লকট্রান্স%} All_ Choice% as হিসাবে পছন্দ ০. সহ .0%
কে-এর জন্য for%, সমস্ত_চয়েস.উইয়ে_পরিস্কার% in % end%% এর জন্য
        
{% শেষ করা%}

এখন আমাদের কাছে একটি পাঠ্য ইনপুট সহ একটি ফিল্টার রয়েছে যা অন্যান্য ফিল্টারগুলির সাথে ভাল কাজ করে। এখন আপনাকে যা করতে হবে তা হ'ল এটি মুছতে একটি বিকল্প যুক্ত করা।

ফিল্টার সাফ করার জন্য আমাদের এমন একটি ইউআরএল প্রয়োজন যাতে আমাদের বাদে সমস্ত ফিল্টার রয়েছে:

// টেমপ্লেট / অ্যাডমিন / ইনপুট_ফিল্টার.html
...
_% যদি সমস্ত_চয়েস না হয় se% নির্বাচিত%} ⨉ {% ট্রান্স 'সরান'%} {% শেষ যদি%} ...

ভয়েল!

আমরা কী পাই:

অন্যান্য ফিল্টার এবং একটি অপসারণ বোতামের সাথে ইনপুট ফিল্টার

সম্পূর্ণ কোড:

বোনাস

জ্যাঙ্গো অনুসন্ধানের মতো একাধিক শব্দের সন্ধান করুন

আপনি লক্ষ করেছেন যে জ্যাঙ্গো যখন একাধিক শব্দের অনুসন্ধান করে, তখন এটি এমন ফলাফল খুঁজে পায় যাতে অন্তত একটি শব্দ থাকে এবং সেগুলি সবগুলিতে থাকে না।

উদাহরণস্বরূপ, আপনি যদি কোনও ব্যবহারকারীর সন্ধান করেন, "জন ডুও" জ্যাঙ্গো "জন ফু" এবং "বার ডায়" উভয়ই খুঁজে পান। আপনি পুরো নাম, পণ্যের নাম ইত্যাদি সন্ধান করার সময় এটি খুব সহজ hand

আমরা আমাদের ইনপুট ফিল্টার দিয়ে অনুরূপ শর্তটি প্রয়োগ করতে পারি:

django.db.models থেকে আমদানি প্রশ্ন
ক্লাসের ইউজার ফিল্টার (ইনপুটফিল্টার): প্যারামিটারের নাম = 'ব্যবহারকারী' শিরোনাম = _ ('ব্যবহারকারী')
ডিফ ক্যোয়ারীসেট (স্ব, অনুরোধ, ক্যোরিসেট): পদ = স্ব.মূল্য ()
শব্দটি যদি "কোনও নয়" হয়: ফিরে আসুন
যেকোন_নাম = কিউ () টার্মের বিট জন্য।
ফেরত ক্যোয়ারসেট.ফিল্টার (যে কোনও নাম)

এটাই!

জ্যাঙ্গো অ্যাডমিনে আমার অন্যান্য পোস্টগুলি দেখুন: