আপনি কি অ্যাডমিন জুড়ে কোনও জ্যাঙ্গো অ্যাপ্লিকেশনটিকে ভার্বোজের নাম দিতে পারেন?


140

যেভাবে আপনি জ্যাঙ্গো অ্যাডমিনে প্রদর্শিত ক্ষেত্র এবং মডেলগুলি ভার্বোজের নাম দিতে পারেন, আপনি কি কোনও অ্যাপ্লিকেশনকে কাস্টম নাম দিতে পারেন?


4
এই টিকিটটি এটিকে সম্বোধন করবে: কোড . djangoproject.com/ticket/3591 । দুর্ভাগ্যক্রমে, দেখে মনে হচ্ছে এটি শীঘ্রই জ্যাঙ্গোতে সংহত হবে ...
বেনজমিন ওহলওয়েন্ড

10
জ্যাঙ্গো ১.7 অনুসারে এটি এখন বাক্সের বাইরেও সম্ভব
ডকস.ড্যাঞ্জোপ্রজেক্ট.

উত্তর:


182

জ্যাঙ্গো 1.8+ +

প্রতি 1.8 ডক্স (এবং বর্তমান ডক্স ),

নতুন অ্যাপ্লিকেশনগুলি এড়ানো উচিত default_app_config। পরিবর্তে তাদের যথাযথ AppConfigসাবক্লাসের বিন্দুযুক্ত পথটি স্পষ্টভাবে কনফিগার করতে হবে INSTALLED_APPS

উদাহরণ:

INSTALLED_APPS = [
    # ...snip...
    'yourapp.apps.YourAppConfig',
]

তারপরে AppConfigনীচে তালিকাভুক্ত হিসাবে আপনার পরিবর্তন করুন ।

জ্যাঙ্গো ১.7

ওপিকে রনউইকসের মন্তব্যে যেমন বলা হয়েছে, জ্যাঙ্গো ১.7 থেকে বাক্সের বাইরে এটি এখন সম্ভব

ডক্স থেকে নেওয়া :

# in yourapp/apps.py
from django.apps import AppConfig

class YourAppConfig(AppConfig):
    name = 'yourapp'
    verbose_name = 'Fancy Title'

তারপরে default_app_configভেরিয়েবলটি সেট করুনYourAppConfig

# in yourapp/__init__.py
default_app_config = 'yourapp.apps.YourAppConfig'

জ্যাঙ্গোর আগে 1.. 1.

আপনার মডেল সংজ্ঞায় অ্যাপ_লাবেল সংজ্ঞায়িত করে আপনি আপনার অ্যাপ্লিকেশনটিকে একটি কাস্টম নাম দিতে পারেন। তবে জাঙ্গো অ্যাডমিন পৃষ্ঠা তৈরি করার সাথে সাথে তাদের অ্যাপ_লবেল দ্বারা হ্যাশ মডেলগুলি তৈরি করবে, সুতরাং আপনি যদি তাদের একটি অ্যাপ্লিকেশনে উপস্থিত হতে চান তবে আপনাকে আপনার অ্যাপ্লিকেশনটির সমস্ত মডেলে এই নামটি সংজ্ঞায়িত করতে হবে।

class MyModel(models.Model):
        pass
    class Meta:
        app_label = 'My APP name'

12
অ্যাডমিনে এটি নিয়ে আমার সমস্যা হচ্ছিল। অ্যাপ_লেবেলের উপর এতটা নির্ভর করে যে আমি যখন নাম পরিবর্তন শুরু করি তখন এটি সেই জিনিসটি ভেঙে দেয়।
জো জে

আমি জানি, আমি একটি টেমপ্ল্যাট্যাগ লিখে শেষ করেছি যার সাথে ড্যাপ ছিল অ্যাপ_আরল: অ্যাপ্লিকেশন_নাম বাইন্ডিং।
ফ্রস্ট.বাকা

58
দ্রষ্টব্য, এটি ভার্ভোজের নামের মতো নয়, এই অর্থে যে এটি কেবল ব্যবহারকারীর দেখানো বিষয়কেই প্রভাবিত করে। এটি আক্ষরিক স্ট্রিংটি ডাটাবেসে টেবিলটির নামকরণে ব্যবহৃত হয়, যদি আপনি কোনও বিদ্যমান মডেল পরিবর্তন করেন তবে স্কিমা মাইগ্রেশন প্রয়োজন।
সেরিন

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

এই জনপ্রিয় উত্তরটি হ্যাক / ওয়ার্কআরাউন্ড ব্যবহার করার পরামর্শ দেয় যা জ্যাঙ্গো 1.7 এর আগে প্রয়োজন ছিল। আপনি যদি 1.7 বা ততোধিক ব্যবহার করে থাকেন তবে নীচে iMaGiNiX দ্বারা প্রস্তাবিত অ্যাপস.পি ফাইল ব্যবহার করুন।
শ্যাকার ২২ শে

38

ওপিকে রনউইকসের মন্তব্যে যেমন বলা হয়েছে, জ্যাঙ্গো ১.7 থেকে বাক্সের বাইরে এটি এখন সম্ভব

ডক্স থেকে নেওয়া :

# in yourapp/apps.py
from django.apps import AppConfig

class YourAppConfig(AppConfig):
    name = 'yourapp'
    verbose_name = 'Fancy Title'

তারপরে default_app_configভেরিয়েবলটি সেট করুনYourAppConfig

# in yourapp/__init__.py
default_app_config = 'yourapp.apps.YourAppConfig'

এটি খুব ভাল লেগেছে, তবে আপনি যদি INTALLED_APPS তে জ্যাঙ্গো পুনঃসংশোধনের উদাহরণ হিসাবে অ্যাপ্লিকেশনটি ইনস্টল করেন তবে init .py ফাইলের কোডটির প্রয়োজন নেই: 'App_name.apps.AppnameConfig'
রবার্থ সলিস

31

অ্যাপে যদি আপনার একাধিক মডেল থাকে তবে কেবল মেটা তথ্য দিয়ে একটি মডেল তৈরি করুন এবং আপনার সমস্ত মডেলের জন্য এই শ্রেণীর সাবক্লাস তৈরি করুন।

class MyAppModel(models.Model):
    class Meta:
        app_label = 'My App Label'
        abstract = True

class Category(MyAppModel):
     name = models.CharField(max_length=50)

12

তাদের একটি verbose_name সম্পত্তি দিন।

আপনার আশা না পেতে। আপনাকে django.contrib.admin.sites থেকে আপনার নিজস্ব প্রকল্পআডমিনসাইট ভিউতে সূচি ভিউটি অনুলিপি করতে হবে এবং এটি আপনার নিজস্ব কাস্টম অ্যাডমিন দৃষ্টান্তে অন্তর্ভুক্ত করতে হবে:

class ProjectAdminSite(AdminSite):
    def index(self, request, extra_context=None):
        copied stuff here...

admin.site = ProjectAdminSite()

তারপরে অনুলিপি করা দৃশ্যটি টুইঙ্ক করুন যাতে এটি অ্যাপ্লিকেশনটির লেবেল হিসাবে আপনার ভার্বোস_নাম সম্পত্তিটি ব্যবহার করে।

অনুলিপি করা ভিউতে কিছুটা যুক্ত করে এটি করেছি:

        try:
            app_name = model_admin.verbose_name
        except AttributeError:
            app_name = app_label

আপনি যখন সূচক দেখুনটি টুইট করছেন তখন কেন 'আদেশ' সম্পত্তিটি যুক্ত করবেন না।


12

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

    class Meta:
       app_label = 'Tasks'
       db_table = 'mytodo_todo'

আশা করি এটা সাহায্য করবে.


7

জাজানো ১.৪ এর জন্য (এখনও প্রকাশিত হয়নি, তবে ট্রাঙ্কটি বেশ স্থিতিশীল), আপনি নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন। এটি নির্ভর করে যে অ্যাডমিনসাইট এখন একটি টেম্পলেট রিস্পনস দেয়, যা আপনি এটি রেন্ডার করার আগে পরিবর্তন করতে পারেন।

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

from functools import wraps
def rename_app_list(func):
    m = {'Sites': 'Web sites',
         'Your_app_label': 'Nicer app label',
    }

    @wraps(func)
    def _wrapper(*args, **kwargs):
        response = func(*args, **kwargs)
        app_list = response.context_data.get('app_list')

        if app_list is not None:
            for a in app_list:
                name = a['name']
                a['name'] = m.get(name, name)
        title = response.context_data.get('title')
        if title is not None:
            app_label = title.split(' ')[0]
            if app_label in m:
                response.context_data['title'] = "%s administration" % m[app_label]
        return response
    return _wrapper

admin.site.__class__.index = rename_app_list(admin.site.__class__.index)
admin.site.__class__.app_index = rename_app_list(admin.site.__class__.app_index)

এটি সূচক এবং অ্যাপ_আইডেক্সের দর্শনগুলি স্থির করে। এটি অন্যান্য সমস্ত অ্যাডমিন দর্শনগুলিতে রুটির ক্র্যাম্বস ঠিক করে না।


7

প্রথমে আপনাকে apps.pyআপনার অ্যাপফোল্ডারে এই জাতীয় একটি ফাইল তৈরি করতে হবে :

# appName/apps.py

# -*- coding: utf-8 -*-             
from django.apps import AppConfig

class AppNameConfig(AppConfig):
    name = 'appName'
    verbose_name = "app Custom Name"

এই অ্যাপকনফিগ সাবক্লাসটি ডিফল্টরূপে লোড করতে:

# appName/__init__.py
default_app_config = 'appName.apps.AppNameConfig'

সবচেয়ে ভাল উপায়। জ্যাঙ্গো ১.7 এ পরীক্ষা করা হয়েছে

আমার কাস্টম অ্যাপ নাম

স্প্যানিশদের সাথে যার সমস্যা ছিল For

এই কোডটি পাইথন 2 স্ক্রিপ্টগুলিতে utf-8 সামঞ্জস্যতা সক্ষম করে

# -*- coding: utf-8 -*-

মাত্র কয়েকটি প্যাডেন্টিক সাইড-নোট: নামের একটি ফাইল তৈরি করা apps.pyবাধ্যতামূলক নয়। কোনও নামই ঠিক আছে (তবে আপনাকে এটিতে উল্লেখ করতে হবে __init__.py)। ইতিমধ্যে অন্যান্য মন্তব্যে আগেই বলা হয়েছে, এই কোডটি জাঙ্গো > = 1.7 ( ডকস.ডজ্যাঙ্গোপ্রজেক্ট /en/1.7/ref/applications/… ) এর জন্য কাজ করে।
ফুরিন্স

এটি খুব ভাল লেগেছে, তবে আপনি যদি INTALLED_APPS তে জ্যাঙ্গো পুনঃসংশোধনের উদাহরণ হিসাবে অ্যাপ্লিকেশনটি ইনস্টল করেন তবে init .py ফাইলের কোডটির প্রয়োজন নেই: 'App_name.apps.AppnameConfig'
রবার্থ সলিস

6

না, তবে আপনি প্রশাসক টেম্পলেটটি অনুলিপি করতে পারেন এবং সেখানে অ্যাপের নামটি সংজ্ঞায়িত করতে পারেন।


3

এমন একটি হ্যাক রয়েছে যা করতে কোনও মাইগ্রেশন প্রয়োজন হয় না। আয়নেলের ব্লগ থেকে নেওয়া এবং কৃতিত্ব তার কাছে যায়: http://blog.ionelmc.ro/2011/06/24/custom-app-names-in-the-django-admin/

এর জন্য একটি টিকিটও রয়েছে যা জ্যাঙ্গো 1.7 এ স্থির করা উচিত https://code.djangoproject.com/ticket/3591 এ

"" "

ধরুন আপনার কাছে এর মতো মডেল রয়েছে:

class Stuff(models.Model):
    class Meta:
        verbose_name = u'The stuff'
        verbose_name_plural = u'The bunch of stuff'

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

দেখা যাচ্ছে যে অ্যাডমিন অ্যাপ্লিকেশন_প্রেম ব্যবহার করে। প্রদর্শনের জন্য শিরোনাম () যাতে আমরা কিছুটা হ্যাক করতে পারি: ওভারডেন শিরোনাম পদ্ধতি সহ স্ট্রিং সাবক্লাস:

class string_with_title(str):
    def __new__(cls, value, title):
        instance = str.__new__(cls, value)
        instance._title = title
        return instance

    def title(self):
        return self._title

    __copy__ = lambda self: self
    __deepcopy__ = lambda self, memodict: self

এখন আমরা এই মত মডেল থাকতে পারে:

class Stuff(models.Model):
    class Meta:
        app_label = string_with_title("stuffapp", "The stuff box")
        # 'stuffapp' is the name of the django app
        verbose_name = 'The stuff'
        verbose_name_plural = 'The bunch of stuff'

এবং প্রশাসক অ্যাপ্লিকেশনটির নাম হিসাবে "স্টাফ বক্স" প্রদর্শন করবে।

"" "


2

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

class MyOldModel(models.Model):
    pass

class MyNewModel(MyOldModel):
    class Meta:
        proxy = True
        app_label = 'New APP name'
        verbose_name = MyOldModel._meta.verbose_name

তারপরে আপনার এটিকে আপনার প্রশাসক.পিতে পরিবর্তন করতে হবে:

#admin.site.register(MyOldModel, MyOldModelAdmin)
admin.site.register(MyNewModel, MyOldModelAdmin)

ইউআরএলটি / অ্যাডমিন / নিউএপপ্লেম / মেনিউমডেল হবে / তাই আপনি কেবল এটি নিশ্চিত করতে চাইতে পারেন যে নতুন মডেলের ক্লাসের নামটি পুরানো মডেলের যতটা সম্ভব দেখতে পেয়েছে।


1

ঠিক আছে, এটি আমার পক্ষে কাজ করে। অ্যাপ.পি-তে এটি ব্যবহার করুন:

class MainConfig(AppConfig):
    name = 'main'
    verbose_name="Fancy Title"

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

INSTALLED_APPS = [
    'main.apps.MainConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

]


0

নিম্নলিখিত প্লাগ ও প্লে কোডের কোডটি পুরোপুরি পুরোপুরি কাজ করে Django 1.7। আপনাকে যা করতে হবে তা হ'ল __init__.pyনির্দিষ্ট অ্যাপের ফাইলে নীচের কোডটি অনুলিপি করে VERBOSE_APP_NAMEপ্যারামিটারটি পরিবর্তন করতে হবে ।

from os import path
from django.apps import AppConfig

VERBOSE_APP_NAME = "YOUR VERBOSE APP NAME HERE"


def get_current_app_name(file):
    return path.dirname(file).replace('\\', '/').split('/')[-1]


class AppVerboseNameConfig(AppConfig):
    name = get_current_app_name(__file__)
    verbose_name = VERBOSE_APP_NAME


default_app_config = get_current_app_name(__file__) + '.__init__.AppVerboseNameConfig'

আপনি যদি একাধিক অ্যাপ্লিকেশানের জন্য এটি ব্যবহার করেন তবে আপনার কোনও get_current_app_nameফাংশনটি কোনও সহায়ক ফাইলে ফ্যাক্ট করতে হবে।

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