জ্যাঙ্গো টেমপ্লেটে সম্পর্কিত আইটেমগুলি বাছাই করা হচ্ছে


88

ডিজেঙ্গো টেম্পলেটে সম্পর্কিত আইটেমগুলির একটি সেটকে বাছাই করা সম্ভব?

এটি: এই কোড (এইচটিএমএল ট্যাগ সহ স্পষ্টতার জন্য বাদ দেওয়া):

{% for event in eventsCollection %}
   {{ event.location }}
   {% for attendee in event.attendee_set.all %}
     {{ attendee.first_name }} {{ attendee.last_name }}
   {% endfor %}
 {% endfor %}

প্রদর্শন ঠিক প্রায় আমি চাই চাই। কেবলমাত্র আমি পরিবর্তন করতে চাই আমি হ'ল নাম অনুসারে বাছাই করা উপস্থিতদের তালিকা। আমি এরকম কিছু বলার চেষ্টা করেছি:

{% for event in events %}
   {{ event.location }}
   {% for attendee in event.attendee_set.order_by__last_name %}
     {{ attendee.first_name }} {{ attendee.last_name }}
   {% endfor %}
 {% endfor %}

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

আমি অবশ্যই আমার দৃষ্টিতে এক প্রকারের সাজানো অংশগ্রহণকারী তালিকার অ্যারে তৈরি করতে পারি, তবে এটি একটি কুৎসিত এবং ভঙ্গুর (এবং আমি কী কুৎসিত উল্লেখ করেছি)।

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

===============================================

তওমাসের উত্তর গ্রহণের পরে অতিরিক্ত চিন্তা যুক্ত করার জন্য সম্পাদিত।


তওমাস যেমনটি আমি উপস্থাপন করলাম ঠিক তেমন বিষয়টিই সম্বোধন করেছে - যদিও সমাধানটি আমার প্রত্যাশা ছিল না। ফলস্বরূপ আমি একটি দরকারী কৌশল শিখেছি যা অন্যান্য পরিস্থিতিতেও ব্যবহার করা যেতে পারে।

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

"কুরুচিপূর্ণ" একটি অন্ত্রের প্রতিক্রিয়া ছিল এবং আমি এতে কী ভুল ছিল তা পরিষ্কার করতে চেয়েছিলাম। এটি করার সময় আমি বুঝতে পেরেছিলাম যে এটি একটি কুশ্রী পদ্ধতির কারণ হ'ল কারণ যে টেমপ্লেটটি রেন্ডার করার জন্য সেট করে একটি কোয়েরি পাস করার আইডিয়াটিতে আমাকে ঝুলিয়ে রাখা হয়েছিল। আমি যদি সেই প্রয়োজনটি শিথিল করি তবে একটি অশুভ পদ্ধতির কাজ করা উচিত।

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

eventCollection = []   
events = Event.object.[filtered and sorted to taste]
for event in events:
   event.attendee_list = event.attendee_set.[filtered and sorted to taste]
   eventCollection.append(event)

এখন টেমপ্লেটটি হয়ে যায়:

{% for event in events %}
   {{ event.location }}
   {% for attendee in event.attendee_list %}
     {{ attendee.first_name }} {{ attendee.last_name }}
   {% endfor %}
 {% endfor %}

নেতিবাচক দিকটি হল ভিউটিকে একবারে সমস্ত ইভেন্টকে "সত্যায়িত" করতে হবে যা বিপুল সংখ্যক ইভেন্ট থাকলে সমস্যা হতে পারে। অবশ্যই একটি পৃষ্ঠাবদ্ধকরণ যোগ করতে পারে, কিন্তু এটি দর্শনটি যথেষ্ট জটিল করে তোলে।

উল্টোটি হল "প্রদর্শিত তথ্য উপাত্ত প্রস্তুত করুন" কোডটি সেই ভিউতে রয়েছে যেখানে এটি প্রদর্শিত হয় যাতে প্রদর্শনের জন্য ভিউ দ্বারা সরবরাহিত ডেটা ফর্ম্যাট করার ক্ষেত্রে টেমপ্লেটটিকে ফোকাস করতে দেয়। এটি সঠিক এবং যথাযথ।

তাই আমার পরিকল্পনাটি বড় টেবিলগুলির জন্য তওমাসের কৌশল এবং ছোট টেবিলগুলির জন্য উপরের কৌশলটি ব্যবহার করতে হবে, পাঠকের কাছে বড় এবং ছোট বামের সংজ্ঞা সহ (গ্রিন))

উত্তর:


137

আপনাকে এইভাবে অংশগ্রহণকারী মডেলটিতে ক্রমটি নির্দিষ্ট করতে হবে। উদাহরণস্বরূপ (ধরে নিলাম আপনার মডেল শ্রেণির নাম অ্যাটেন্ডি রাখা হয়েছে):

class Attendee(models.Model):
    class Meta:
        ordering = ['last_name']

আরও রেফারেন্সের জন্য ম্যানুয়াল দেখুন ।

সম্পাদনা । আরেকটি সমাধান হ'ল আপনার ইভেন্টের মডেলটিতে একটি সম্পত্তি যুক্ত করা, যা আপনি নিজের টেম্পলেট থেকে অ্যাক্সেস করতে পারেন:

class Event(models.Model):
# ...
@property
def sorted_attendee_set(self):
    return self.attendee_set.order_by('last_name')

আপনার এগুলি প্রয়োজন হিসাবে আপনি আরও সংজ্ঞা দিতে পারেন ...


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

আমি আপনার জন্য একটি বিকল্প সমাধান যোগ করেছি। এটি আপনার প্রয়োজনীয় নমনীয়তার অনুমতি দেয়।
তাওমাস

@ মার্ক আসলেই তা করে। যতদূর আমি বুঝতে @propertyOverkill এখানে আছে কোন getters বা setters জড়িত: stackoverflow.com/questions/1554546/...
রিক Westera

যদিও এই টেম্পলেটটির জন্য কঠোরভাবে প্রয়োজন নেই, আমি দেখতে পেলাম যে এখানে @ প্রপার্টি অ্যাপ্লিকেশন কোড থেকে ক্লিনার অ্যাক্সেসের জন্য তৈরি করে , যদিও এতে একটি ছোট পারফরম্যান্স জরিমানা রয়েছে (আমার ল্যাপটপে <30 এনএস)। এটি অবশ্যই শৈলীর এবং অত্যন্ত বিষয়গত বিষয়।
তাওমাস

আপনি যদি দুটি বৈশিষ্ট্যের সাথে
সম্মতভাবে সেটটিকে

140

আপনি টেমপ্লেট ফিল্টার ডিক্টসোর্ট ব্যবহার করতে পারেন https://docs.djangoproject.com/en/dev/ref/templates/builtins/#std:templatefilter-dictsort

এই কাজ করা উচিত:

{% for event in eventsCollection %}
   {{ event.location }}
   {% for attendee in event.attendee_set.all|dictsort:"last_name" %}
     {{ attendee.first_name }} {{ attendee.last_name }}
   {% endfor %}
 {% endfor %}

23
দুর্দান্ত! আর যারা ভাবছি জন্য, এছাড়াও dictsortreversed: docs.djangoproject.com/en/dev/ref/templates/builtins/...
Mickaël

4
আমার মূল পোস্টটি থেকে উদ্ধৃত করার জন্য: আহ, যদি কেবল একটি কোয়েরি সেট করা হয় তবে অভিধান ডিক্টসোর্টটি কাজটি করত, তবে এটি হয় না এবং তা হয় না।
ডেল উইলসন

আমি মনে করি এটি অনুশীলনে কম হওয়া উচিত, এবং রেকর্ডগুলি আনার আগে মডেলটিকে বাছাই করা পরিচালনা করতে দিন।
acpmasquerade

4
@ ডেলাউইলসন, আমি dictsortপ্রায় ঠিক আপনার মতো কোডে ঠিকভাবে কাজ করেছি । মজার বিষয় এটি ক্যোয়ারসেটগুলিতে দুর্দান্ত কাজ করছে বলে মনে হচ্ছে।
mlissner

4
এবং কেবল আরও স্পষ্টতার জন্য, স্পেসস বিষয়টি: {% for attendee in event.attendee_set.all|dictsort:"last_name" %}উপস্থিতিগুলিকে {% for attendee in event.attendee_set.all | dictsort:"last_name" %}বাছাই করে তবে লুপের আউটপুটটিকে সাজানোর চেষ্টা করে এবং ব্রেক করে for
mattsl

5

একটি সমাধান হ'ল একটি কাস্টম টেমপ্ল্যাট্যাগ করা:

@register.filter
def order_by(queryset, args):
    args = [x.strip() for x in args.split(',')]
    return queryset.order_by(*args)

এটি ব্যবহার করুন:

{% for image in instance.folder.files|order_by:"original_filename" %}
   ...
{% endfor %}

0

পুনরায় গোষ্ঠীটি আপনি যা করতে চান তা করতে সক্ষম হওয়া উচিত, তবে আপনি কীভাবে সেই দৃশ্যে ফিরে যেতে চান সেভাবে আদেশ করতে না পারার কোনও কারণ আছে?


তাদের দৃশ্যে অর্ডার করার জন্য আমাকে ইভেন্টগুলির মধ্য দিয়ে পুনরাবৃত্তি করতে হবে এবং প্রতিটি ইভেন্টের জন্য সঠিকভাবে সাজানো ক্রমে সেই ইভেন্টের সাথে সম্পর্কিত কোনও ধরণের উপস্থিতির একটি ধারক তৈরি করতে হবে, তারপরে সেই পাত্রে পুরো সংগ্রহটি কোনও ফর্মের মধ্যে টেমপ্লেটে পাস করবে যা টেমপ্লেট অংশগ্রহণকারীদের উপযুক্ত সংগ্রহ পাবেন যেমন দেওয়া হবে এটা ঘটনা মাধ্যমে iterated। আমি যেমন বলেছি, এটি করা যেতে পারে তবে এটি কোনও ভাল সমাধান নয়। এর জন্য ভিউ এবং টেমপ্লেট, সমান্তরাল পুনরাবৃত্তি ইত্যাদির মধ্যে অনেক বেশি সংযোগ স্থাপন দরকার what
ডেল উইলসন

আমি পুনরায় গোষ্ঠীর দিকে তাকিয়েছিলাম এবং এটি যা চেয়েছিল তা করার জন্য এটি প্রদর্শিত হয়নি। বিশেষত ডকুমেন্টেশন বলে: [উদ্ধৃতি] নোট করুন যে {% পুনরায় গ্রুপ% its এর ইনপুট অর্ডার করে না! আমাদের উদাহরণ এই সত্যের উপর নির্ভর করে যে লোকদের তালিকাটি লিঙ্গ দ্বারা প্রথমে অর্ডার করা হয়েছিল। [সমাপ্তি]
ডেল উইলসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.