জ্যাঙ্গো অ্যাডমিন, একটি মডেল লুকান


87

অ্যাডমিন সাইটের মূল পৃষ্ঠায় যেখানে নিবন্ধিত মডেলগুলি উপস্থিত হয়, আমি জ্যাঙ্গো প্রশাসকের নিবন্ধিত বেশ কয়েকটি মডেলকে আড়াল করতে চাই।

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

কিভাবে এই কাজ করা যেতে পারে ?

উত্তর:


124

X0nix এর উত্তরের ভিত্তিতে আমি কিছু পরীক্ষা-নিরীক্ষা করেছি। দেখে মনে হচ্ছে কোনও শূন্য ডিক্ট ফিরিয়ে দেওয়া থেকে get_model_permsসূচি html থেকে মডেলটিকে বাদ দেওয়া হয়েছে, যদিও এখনও আপনাকে সরাসরি উদাহরণগুলি সম্পাদনা করার অনুমতি দেওয়া হচ্ছে।

class MyModelAdmin(admin.ModelAdmin):
    def get_model_perms(self, request):
        """
        Return empty perms dict thus hiding the model from admin index.
        """
        return {}

admin.site.register(MyModel, MyModelAdmin)

রাজি। আমি কোড পরিবর্তন করতে চাই না শুধুমাত্র যখন সমস্যা। আমার অর্থ হ'ল, আমার কাছে একটি বেস অ্যাপ রয়েছে যা আমি অন্যান্য অ্যাপ্লিকেশনগুলির উপর নির্ভরতা থেকে পরিষ্কার রাখতে চাই। আমি এই নির্ভরতাগুলি একটি উত্পন্ন প্রকল্প-নির্দিষ্ট অ্যাপ্লিকেশনটিতে রাখি। এখন আমি চাই অ্যাডমিন ইন্টারফেসটি কেবলমাত্র অ্যাপ্লিকেশনটি দেখায়, বেস অ্যাপটি নয়। জ্যাঙ্গোর জন্য প্রাপ্ত অ্যাপ্লিকেশনটির কাজ করার জন্য বেস অ্যাপটি সেটিংসে / INSTALLED_APPS তালিকাভুক্ত করা দরকার। স্পষ্টতই, বেস অ্যাপটি প্রদর্শন করা উচিত নয়, তবে একই সাথে আমি এটিকে অপরিবর্তিত এবং পুনরায় ব্যবহারযোগ্য রাখতে চাই না [দেখুন [এখানে] ( স্ট্যাক এক্সচেঞ্জ / প্রশ্নসমূহ / 13923968 /)।
সেভেন

6
একটি সংক্ষিপ্ত উপায়:get_model_perms = lambda self, req: {}
টিগ্রান সালুয়েভ

4
আমি যদি কোনও মডেলকে কোনও নির্দিষ্ট ব্যবহারকারীআডমিনের ফর্মটি আড়াল করতে চাই তবে কী হবে?
আলিরিজা সানাই

4
এই সমাধানটি সম্পর্কে সতর্কতা অবলম্বন করুন - লিঙ্কটি অদৃশ্য হওয়া সত্ত্বেও, ব্যবহারকারী নিজের মতো করে বস্তুটিতে ঝাঁপিয়ে
পড়তে

35

জ্যাঙ্গোর জন্য 1.8 এবং তারও বেশি

জ্যাঙ্গো ১.৮ থেকে যেহেতু ModelAdminএকটি নতুন পদ্ধতি পেয়েছে has_module_permission()যা অ্যাডমিন সূচকে একটি মডেল প্রদর্শনের জন্য দায়ী।

অ্যাডমিন সূচক থেকে কোনও মডেলকে আড়াল করতে, কেবল আপনার ModelAdminক্লাসে এই পদ্ধতিটি তৈরি করুন এবং ফিরে আসুন False। উদাহরণ:

class MyModelAdmin(admin.ModelAdmin):
    ...
    def has_module_permission(self, request):
        return False

দুর্ভাগ্যক্রমে has_module_permissionপুরো অ্যাপ্লিকেশনটিকে প্রভাবিত করে কেবল একটি মডেলকে নয়। সুতরাং এটিকে কোনও মডেলটিতে যুক্ত করার ফলে অ্যাপ্লিকেশন মডেল তালিকায় (/ অ্যাডমিন / অ্যাপ_লাবেল /) 403 টি নিষিদ্ধ হয়ে যায়। দেখুন জ্যাঙ্গো / contrib / অ্যাডমিন / sites.py
ফ্যাবিয়ান

4
@ ফ্যাবিয়ান আমি মনে করি এটি একটি বাগ। আমি জাঙ্গোর আইআরসি চ্যানেলে এটি জিজ্ঞাসা করেছি এবং সেখানকার কিছু লোক সম্মত হন যে এই আচরণটি অনাকাঙ্ক্ষিত।
xyres

@ ফ্যাবিয়ান অ্যাডমিন সূচী পৃষ্ঠাটি ধরে নিয়ে এখনও / অ্যাডমিনের সাথে লিঙ্ক করে / এই বাগটি জাতীয় কোনও কিছুর দ্বারা আটকানো সম্ভব return request.path!='/admin/'। দুর্ভাগ্যক্রমে অ্যাপ্লিকেশন মডেল তালিকার সেই মডেলগুলি পুনরায় সক্ষম করে।
ecp

আমি এই বাগের জন্য এখানে একটি টিকিট খুলেছি । এটি এখানে স্থির করা হয়েছে । আশা করি, এটি পরবর্তী প্রকাশে অন্তর্ভুক্ত করা উচিত।
xyres

জাজানো ১.১১-তে গভীর লিঙ্কটি এখনও কাজ করে তবে
সত্ত্বাটি

22

একই সমস্যা পেয়েছি, এখানে আমি কী নিয়ে এসেছি।

পূর্ববর্তী সমাধানের মতো - জ্যাঙ্গো থেকে আপনার /admin/index.html অনুলিপি সূচক html অনুলিপি করুন এবং এটির মতো এটি সংশোধন করুন:

{% for model in app.models %}
    {% if not model.perms.list_hide %}
    <tr>
    ...
    </tr>
    {% endif %}
{% endfor %}

এবং মডেলএডমিন সাবক্লাস তৈরি করুন:

class HiddenModelAdmin(admin.ModelAdmin):
    def get_model_perms(self, *args, **kwargs):
        perms = admin.ModelAdmin.get_model_perms(self, *args, **kwargs)
        perms['list_hide'] = True
        return perms

এখন হিডডমডেল অ্যাডমিন সাবক্লাসের সাথে নিবন্ধিত কোনও মডেল অ্যাডমিন তালিকায় প্রদর্শিত হবে না, তবে বিস্তারিতভাবে "প্লাস" চিহ্নের মাধ্যমে উপলব্ধ হবে:

class MyModelAdmin(HiddenModelAdmin):
    ...

admin.site.register(MyModel, MyModelAdmin)


1

এটি শীর্ষ x0nix উত্তরের একটি বিকল্প বিল্ডিং, এবং আপনি যদি খুশি হন তবে jquery দিয়ে সারিগুলি লুকিয়ে রাখবেন।

অন্যটি থেকে অনুলিপি কাস্ট করা অংশটি আমি পুনরায় ব্যবহার করেছি উত্তর

class HiddenModelAdmin(admin.ModelAdmin):
def get_model_perms(self, *args, **kwargs):
    perms = admin.ModelAdmin.get_model_perms(self, *args, **kwargs)
    perms['list_hide'] = True
    return perms

class MyModelAdmin(HiddenModelAdmin):
...

admin.site.register(MyModel, MyModelAdmin)

তারপরে জাঙ্গো-জ্যাকুরি ইনস্টল করুন এবং তারপরে আপনার /admin/index.htmlটেমপ্লেটে নিম্নলিখিত ব্লকটি যুক্ত করুন :

{% extends "admin:admin/index.html" %}

{% block extrahead %}
    <script type="text/javascript" src="{{ STATIC_URL }}js/jquery.js"></script>
    {% if app_list %}
      <script type="text/javascript">
        $(function(){
          {% for app in app_list %}
            {% for model in app.models %}
                {% if model.perms.list_hide %}
                    $('div.app-{{ app.app_label }}').find('tr.model-{{ model.object_name|lower }}').hide();
                {% endif %}
            {% endfor %}
          {% endfor %}
        });
     </script>
   {% endif %}
{% endblock %}

আপনার পুরো টেম্পলেটটি অনুলিপি করার দরকার নেই, কেবল এটি প্রসারিত করুন এবং extraheadব্লকটিকে ওভাররাইড করুন । উপরের কাজ করার জন্য আপনাকে জ্যাঙ্গো-অ্যাপটেমপ্লেটগুলির প্রয়োজন হবে ।


0

জ্যাঙ্গো ১.২-এ নতুন ই-স্টেটমেন্ট রয়েছে যার অর্থ পছন্দসই বৈশিষ্ট্যটি কেবল অ্যাডমিন / ইনডেক্স html ওভাররাইট করেই প্রাপ্ত করা যেতে পারে

{% if model.name not in "Name of hidden model; Name of other hidden model" %}
    ...
{% endif %}

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

তবে কিছু পরিবর্তন করার আগে, আমি মনে করি লোকেরা এই সম্পর্কে চিন্তা করা উচিত ...

মূলত সমস্যাটি এমন মডেলগুলির সাথে সম্পর্কিত যা কেউ একবারে ড্রপ-ডাউনের বিকল্প যুক্ত করার চেয়ে বেশি ব্যবহার করতে চায় না। "এত উন্নত নন" ব্যবহারকারীদের জন্য অনেকগুলি মডেল থাকা অবস্থায় আতঙ্কিত হয়ে যাওয়ার জন্য অনুমতিগুলির একটি সেট তৈরি করে কার্যকরভাবে এটি কাজ করা যেতে পারে। নির্দিষ্ট মডেলগুলির পরিবর্তনের প্রয়োজন হলে, কেউ কেবল "উন্নত অ্যাকাউন্ট" দিয়ে লগ ইন করতে পারে।


0

রেজিস্ট্রেশন এবং লুকানোর জন্য আমার কাছে প্রচুর মডেল প্রশাসক ছিল, আপনি যদি আরও ডিআরওয়াই সমাধান চান তবে এটি আমার জন্য কাজ করেছে (জাজানো ১.১০, পাইথন ৩.৫)

# admin.py

def register_hidden_models(*model_names):
    for m in model_names:
        ma = type(
            str(m)+'Admin',
            (admin.ModelAdmin,),
            {
                'get_model_perms': lambda self, request: {}
            })
        admin.site.register(m, ma)

register_hidden_models(MyModel1, MyModel2, MyModel3)

আমার ধারণা আপনি যদি অ্যাপ্লিকেশনগুলিতে এটি পুনরায় ব্যবহার করতে চান তবে আপনি এটি কোনও ইউটিলিটি শ্রেণিতে রোল করতে পারেন।


0

জ্যাঙ্গো হিসাবে 1.8.18 , has_module_permission()এখনো বিষয়টি রয়েছে। সুতরাং, আমাদের ক্ষেত্রে আমরা এটিও ব্যবহার করেছি get_model_perms()। তেমনি, কেবলমাত্র নির্দিষ্ট ব্যবহারকারীর জন্য আমাদের মডেলটি আড়াল superuserকরতে হবে তবে এর সূচি প্রবেশে অ্যাক্সেস করতে সক্ষম হওয়া উচিত।

class MyModelAdmin(admin.ModelAdmin):
    def get_model_perms(self, request):
        if not request.user.is_superuser:
            return {}
        return super(MyModelAdmin, self).get_model_perms(request)

admin.site.register(MyModel, MyModelAdmin)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.