তালিকায় অনেকগুলি থেকে জাজো প্রদর্শন করুন


91
class PurchaseOrder(models.Model):
    product = models.ManyToManyField('Product')
    vendor = models.ForeignKey('VendorProfile')
    dollar_amount = models.FloatField(verbose_name='Price')


class Product(models.Model):
   products = models.CharField(max_length=256)

   def __unicode__(self):
       return self.products

আমার কাছে সেই কোড আছে দুর্ভাগ্যক্রমে, ত্রুটিটি অ্যাডমিন.পি-র সাথে আসেManyToManyField

class PurchaseOrderAdmin(admin.ModelAdmin):
    fields = ['product', 'dollar_amount']
    list_display = ('product', 'vendor')

ত্রুটিটি বলে:

'PurchaseOrderAdmin.list_display [0]', 'প্রোডাক্ট' একটি ম্যান্টিটোম্যানিফিল্ড যা সমর্থিত নয়।

যাইহোক, আমি 'product'বাইরে বেরিয়ে এলে এটি সংকলন করে list_display। সুতরাং কিভাবে আমি প্রদর্শন করতে পারেন 'product'মধ্যে list_displayত্রুটি প্রদান ছাড়া?

সম্পাদনা : সম্ভবত আরও ভাল প্রশ্ন আপনি একটি ManyToManyFieldইন প্রদর্শন করবেন কি হতে পারে list_display?

উত্তর:


171

আপনি এটি সরাসরি করতে সক্ষম নাও হতে পারেন। এর ডকুমেন্টেশন থেকেlist_display

ম্যান্টিটোম্যানিফিল্ড ক্ষেত্রগুলি সমর্থিত নয়, কারণ এটি সারণীতে প্রতিটি সারির জন্য একটি পৃথক এসকিউএল বিবৃতি কার্যকর করতে পারে। আপনি যদি তা সত্ত্বেও এটি করতে চান তবে আপনার মডেলটিকে একটি কাস্টম পদ্ধতি দিন এবং সেই পদ্ধতির নামটি তালিকা_ডিসপ্লেতে যুক্ত করুন। (তালিকা_ডিসপ্লেতে কাস্টম পদ্ধতির বিষয়ে আরও তথ্যের জন্য নীচে দেখুন))

আপনি এর মতো কিছু করতে পারেন:

class PurchaseOrderAdmin(admin.ModelAdmin):
    fields = ['product', 'dollar_amount']
    list_display = ('get_products', 'vendor')

    def get_products(self, obj):
        return "\n".join([p.products for p in obj.product.all()])

বা একটি মডেল পদ্ধতি সংজ্ঞায়িত করুন এবং এটি ব্যবহার করুন

class PurchaseOrder(models.Model):
    product = models.ManyToManyField('Product')
    vendor = models.ForeignKey('VendorProfile')
    dollar_amount = models.FloatField(verbose_name='Price')

    def get_products(self):
        return "\n".join([p.products for p in self.product.all()])

এবং অ্যাডমিনে list_display

list_display = ('get_products', 'vendor')

এটি দেখতে সত্যিই একটি ভাল সমাধান বলে মনে হচ্ছে। ধন্যবাদ. যদিও, আমি এখন "প্রোডাক্ট_আইডি" কলামে নাল মান বলতে "ত্রুটি পেয়েছি" নাল-সীমাবদ্ধতা লঙ্ঘন করেছে "এর কোনও অর্থ কী?
মোজজন 26

4
যেহেতু এটি ডাটাবেসটিকে তার হাঁটুর নীচে নামিয়েছে, আপনি কীভাবে কর্মক্ষমতা উন্নত করতে সিলেক্ট-রিলেটেড () বা প্রিফেট_ রিলেটেড () দিয়ে এটি করবেন?
মেঘ কারিগর

4
শুধু ক্ষেত্রে অপ্টিমাইজেশান প্রশ্ন এখনো আকর্ষণীয়, আমি ঠিক একই সমস্যা ছিল এবং জানতে পারলেন যে আপনি কেবল একটি অনুকূল বাস্তবায়ন হতে পারে হয় get_queryset()আপনার জন্য পদ্ধতি ModelAdminদেখুন stackoverflow.com/questions/12354099/...
goetz

4
@ SebastiánVansteenkiste ভাল আইডিয়া, হয়তো cached_propertyসাহায্য করবে। তবে আমি মনে করি এটি সম্ভবত না। যখন আপনি কোনও অনুকূলিত ব্যবহার করেন get_queryset, আপনি উদাহরণস্বরূপ সেখানে জ্যাঙ্গোর পরিবর্তে এসকিউএল-এ পণ্য সংগ্রহ করতে, এবং আপনার ক্যোয়ারসেটে আপনার কাস্টম ডেটা সংরক্ষণ করার মতো উপাত্তগুলিতে ডেটা টিকিয়ে দিতে / প্রাক-প্রক্রিয়া করতে পারেন। তারপরে আপনার কেবলমাত্র এসকিউএল-তে একবারে সেই যুক্তি সম্পাদন করতে হবে এবং যখন সম্পত্তিটি অ্যাক্সেস করা হয় তখন প্রতিটি সারির জন্য নয়।
গোটজ

4
ভাল যুক্তি. আমার নিজের অপ্টিমাইজড কাজটি করা উচিত get_queryset, পুরো
ডক্সটি

16

এইভাবে আপনি এটি করতে পারেন, দয়া করে নীচের স্নিপেটটি চেকআউট করুন:

class Categories(models.Model):
    """ Base category model class """

    title       = models.CharField(max_length=100)
    description = models.TextField()
    parent      = models.ManyToManyField('self', default=None, blank=True)
    when        = models.DateTimeField('date created', auto_now_add=True)

    def get_parents(self):
        return ",".join([str(p) for p in self.parent.all()])

    def __unicode__(self):
        return "{0}".format(self.title)

এবং আপনার অ্যাডমিন.পি মডিউল কল পদ্ধতিতে নিম্নলিখিত:

class categories(admin.ModelAdmin):
    list_display    = ('title', 'get_parents', 'when')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.