জ্যাঙ্গো প্রশাসকের একাধিক মডেল অ্যাডমিন / একই মডেলের জন্য দর্শন views


150

আমি কীভাবে একই মডেলের জন্য একাধিক মডেলএডমিন তৈরি করতে পারি, প্রত্যেকটি আলাদা আলাদাভাবে কাস্টমাইজ করা হয় এবং বিভিন্ন ইউআরএলতে লিঙ্ক থাকে?

ধরা যাক আমার কাছে পোস্টস নামে একটি জ্যাঙ্গো মডেল রয়েছে। ডিফল্টরূপে, এই মডেলের অ্যাডমিন ভিউ সমস্ত পোস্ট অবজেক্টের তালিকা করে।

আমি জানি যে আমি তালিকাতে_ডিসপ্লে বা querysetআমার মডেলএডমিনে পদ্ধতিটিকে ওভাররাইডের মতো তালিকা পরিবর্তন করে বিভিন্নভাবে পৃষ্ঠায় প্রদর্শিত সামগ্রীর তালিকাটি কাস্টমাইজ করতে পারি :

class MyPostAdmin(admin.ModelAdmin):
    list_display = ('title', 'pub_date')

    def queryset(self, request):
        request_user = request.user
        return Post.objects.filter(author=request_user)

admin.site.register(MyPostAdmin, Post)

ডিফল্টরূপে, এটি URL- এ অ্যাক্সেসযোগ্য হবে /admin/myapp/post। তবে আমি একই মডেলের একাধিক মতামত / মডেলএডমিনস রাখতে চাই। উদাহরণস্বরূপ /admin/myapp/postসমস্ত পোস্ট অবজেক্টের /admin/myapp/mypostsতালিকা তৈরি করে এবং ব্যবহারকারীর /admin/myapp/draftpostসমস্ত পোস্টের তালিকা তৈরি করে এবং এখনও প্রকাশিত হয়নি এমন সমস্ত পোস্টের তালিকা তৈরি করতে পারে। (এগুলি কেবল উদাহরণ, আমার আসল ব্যবহারের ক্ষেত্র আরও জটিল)

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

আমি জ্যাঙ্গো উত্সটি দেখেছি এবং আমি দেখতে পেয়েছি ModelAdmin.changelist_viewযে এর মতো ফাংশনগুলি আমার urls.py এ কোনওভাবে অন্তর্ভুক্ত থাকতে পারে তবে আমি ঠিক জানি না কীভাবে এটি কার্যকর হবে।

আপডেট : আমি যা চাই তার করার একটি উপায় খুঁজে পেয়েছি (নীচে দেখুন), তবে আমি এখনও এটি করার অন্যান্য উপায়গুলি শুনতে চাই।

উত্তর:


275

আমি কী চাই তা অর্জন করার একটি উপায় খুঁজে পেয়েছি, প্রক্সি মডেলগুলি ব্যবহার করে প্রতিটি মডেল কেবল একবার নিবন্ধভুক্ত হতে পারে around

class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'pubdate','user')

class MyPost(Post):
    class Meta:
        proxy = True

class MyPostAdmin(PostAdmin):
    def get_queryset(self, request):
        return self.model.objects.filter(user = request.user)


admin.site.register(Post, PostAdmin)
admin.site.register(MyPost, MyPostAdmin)

তারপরে ডিফল্টটি PostAdminঅ্যাক্সেসযোগ্য হবে /admin/myapp/postএবং ব্যবহারকারীর মালিকানাধীন পোস্টগুলির তালিকা হবে /admin/myapp/myposts

Http://code.djangoproject.com / উইকি / ডায়নামিকমোডেলগুলি দেখার পরে , আমি একই জিনিসটি করতে নিম্নলিখিত ফাংশন ইউটিলিটি ফাংশনটি নিয়ে এসেছি:

def create_modeladmin(modeladmin, model, name = None):
    class  Meta:
        proxy = True
        app_label = model._meta.app_label

    attrs = {'__module__': '', 'Meta': Meta}

    newmodel = type(name, (model,), attrs)

    admin.site.register(newmodel, modeladmin)
    return modeladmin

এটি নিম্নলিখিত হিসাবে ব্যবহার করা যেতে পারে:

class MyPostAdmin(PostAdmin):
    def get_queryset(self, request):
        return self.model.objects.filter(user = request.user)

create_modeladmin(MyPostAdmin, name='my-posts', model=Post)

8
এটা সত্যিই দারুন. আমি সচেতন ছিলাম না যে কোনও প্রক্সি মডেল প্রশাসকের সাইটে নিবন্ধিত হতে পারে। এটি আসলে আমাকে অনেক সাহায্য করবে।
ব্র্যান্ডন হেনরি

8
আমার একই মডেল দু'বার জ্যাঙ্গো অ্যাডমিনে নিবন্ধিত করা দরকার এবং প্রক্সি মডেলগুলি কাজ করে বলে মনে হচ্ছে। তবে অনুমতি সিস্টেমটিতে আমি একটি সমস্যা পেয়েছি। এখানে দেখুন: কোড. djangoproject.com/ticket/11154
বুজুনিক্স

4
মডেলএডমিন ক্যোরিসেটের পরিবর্তে ডিফল্ট পরিচালককে পরিবর্তন করাও এটি ভাল ধারণা। সুতরাং প্রক্সি মডেলের আচরণ প্রশাসকের বাইরেও সামঞ্জস্যপূর্ণ।
বুজুনিক্স

4
এখন আসল উত্তরটি হ'ল কেন জ্যাঙ্গো আপনাকে একই মডেলের জন্য দুটি প্রশাসক রাখতে দেয় না? আমাদের কেবল 2 লাইনের জন্য জিনিসগুলি হ্যাক করার দরকার নেই যা এটি পরীক্ষা করে এবং একটি ত্রুটি ছুড়ে দেয়: গুলি। দুর্দান্ত উত্তর এখনও!
হাসেসেক

1
@ জার্ট: এখানে একটি মুলতুবি থাকার অনুরোধ রয়েছে, যা কেবলমাত্র ডক্স অনুপস্থিত বলে মনে হচ্ছে: github.com/django/django/pull/146/files
নীল রঙের

3

পল স্টোন উত্তর একেবারে দুর্দান্ত! কেবল যোগ করতে, জাঙ্গো ১.৪.৫ এর জন্য আমার কাস্টম ক্লাসটি উত্তরাধিকার সূত্রে নেওয়া দরকারadmin.ModelAdmin

class MyPostAdmin(admin.ModelAdmin):
    def queryset(self, request):
        return self.model.objects.filter(id=1)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.