क्या आप पूरे प्रशासन में उपयोग के लिए एक Django ऐप एक क्रिया नाम दे सकते हैं?


140

इसी तरह से आप Django के व्यवस्थापक में दिखाई देने वाले फ़ील्ड और मॉडल क्रिया नाम दे सकते हैं, क्या आप किसी ऐप को कस्टम नाम दे सकते हैं?


4
यह टिकट इसका समाधान होगा: code.djangoproject.com/ticket/3591 । दुर्भाग्य से, ऐसा नहीं लगता है कि यह जल्द ही Django में एकीकृत किया जाएगा ...
बेंजामिन वोहलवेंड

10
Django 1.7 के रूप में यह अब बॉक्स से बाहर संभव है - docs.djangoproject.com/en/1.7/ref/applications/…
rhnwicks

जवाबों:


182

Django 1.8+

प्रति 1.8 डॉक्स (और वर्तमान डॉक्स ),

नए अनुप्रयोगों से बचना चाहिए default_app_config। इसके बजाय उन्हें AppConfigस्पष्ट रूप से कॉन्फ़िगर किए जाने के लिए उपयुक्त उपवर्ग के लिए बिंदीदार पथ की आवश्यकता होनी चाहिए INSTALLED_APPS

उदाहरण:

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

फिर AppConfigनीचे सूचीबद्ध के अनुसार अपना परिवर्तन करें ।

Django 1.7

जैसा कि ओपी को rhnwicks की टिप्पणी से कहा गया है, यह अब Django 1.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'

Django 1.7 से पहले

आप अपने मॉडल की परिभाषा में app_label को परिभाषित करके अपने आवेदन को एक कस्टम नाम दे सकते हैं। लेकिन जैसा कि django ने व्यवस्थापक पृष्ठ बनाया है, इसमें उनके app_label द्वारा हैश मॉडल होंगे, इसलिए यदि आप चाहते हैं कि वे एक एप्लिकेशन में दिखाई दें, तो आपको अपने एप्लिकेशन के सभी मॉडलों में इस नाम को परिभाषित करना होगा।

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

12
मुझे एडमिन में इससे परेशानी हो रही थी। इतना app_label पर निर्भर करता है कि जब मैंने नाम बदलना शुरू किया, तो उस सामान को तोड़ दिया।
जो जे

मुझे पता है, मैंने एक टेम्प्लेटैग लिखना शुरू कर दिया था जिसमें app_url: app_name बाइंडिंग के साथ एक तानाशाही थी।
फ्रॉस्ट.बाका

58
ध्यान दें, यह एक क्रिया नाम के समान नहीं है, इस अर्थ में कि यह केवल वही प्रभाव डालता है जो उपयोगकर्ता को दिखाया गया है। यह डेटाबेस में तालिका का नाम देने के लिए उपयोग किया जाने वाला शाब्दिक स्ट्रिंग है, जिसे मौजूदा मॉडल को बदलने पर स्कीमा माइग्रेशन की आवश्यकता होती है।
सेरिन

6
मुझे नहीं लगता कि यह एक अच्छा समाधान है। इसके कई अन्य दुष्परिणाम हैं जो सौंदर्य नहीं हैं।
डेविड सैंडर्स

यह लोकप्रिय जवाब एक हैक / वर्कअराउंड का उपयोग करने की सिफारिश करता है जो कि Django 1.7 से पहले आवश्यक था। यदि आप 1.7 या इसके बाद के संस्करण का उपयोग कर रहे हैं, तो iMaGiNiX द्वारा नीचे दिए गए अनुशंसा के अनुसार apps.py फ़ाइल का उपयोग करें।
शकर

38

जैसा कि ओपी को rhnwicks की टिप्पणी से कहा गया है, यह अब Django 1.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'

यह अच्छी तरह से woks, लेकिन init .py फ़ाइल में कोड की आवश्यकता नहीं है अगर आप INTALLED_APPS में Django पुनर्संयोजन उदाहरण के रूप में एप्लिकेशन इंस्टॉल करते हैं: '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 संपत्ति दें।

अपनी उम्मीदों पर खरे न उतरें। आपको अपने स्वयं के ProjectAdminSite दृश्य में django.contrib.admin.sites से अनुक्रमणिका दृश्य की प्रतिलिपि बनाने की आवश्यकता होगी और इसे अपने स्वयं के कस्टम व्यवस्थापक उदाहरण में शामिल करना होगा:

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

admin.site = ProjectAdminSite()

फिर कॉपी किए गए दृश्य को ट्विस्ट करें ताकि यह ऐप के लिए लेबल के रूप में आपकी verbose_name संपत्ति का उपयोग करे।

मैंने इसे कॉपी किए गए दृश्य में कुछ इस तरह से जोड़कर किया:

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

जब आप इंडेक्स व्यू को ट्विक कर रहे हैं तो एक 'ऑर्डर' प्रॉपर्टी को भी क्यों न जोड़ें।


12

वैसे मैंने टूडू नाम से एक ऐप शुरू किया है और अब तय किया है कि मैं चाहता हूं कि इसका नाम टास्क रखा जाए । समस्या यह है कि मेरे पास पहले से ही मेरी तालिका के भीतर डेटा है इसलिए मेरा काम इस प्रकार था। मॉडल थ्रेड में रखा गया:

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

आशा करता हूँ की ये काम करेगा।


7

Django 1.4 के लिए (अभी तक जारी नहीं किया गया है, लेकिन ट्रंक बहुत स्थिर है), आप निम्न विधि का उपयोग कर सकते हैं। यह इस तथ्य पर निर्भर करता है कि AdminSite अब एक TemplateResponse लौटाता है, जिसे आप इसे प्रस्तुत करने से पहले बदल सकते हैं।

यहां, हम अपने व्यवहार को सम्मिलित करने के लिए एक छोटा सा बंदर का पेटिंग करते हैं, जिसे यदि आप कस्टम एडमिनसाइट उपवर्ग का उपयोग करते हैं तो बचा जा सकता है।

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)

यह सूचकांक और app_index विचारों को ठीक करता है। यह अन्य सभी व्यवस्थापक विचारों में ब्रेड के टुकड़ों को ठीक नहीं करता है।


7

सबसे पहले आपको apps.pyअपने appfolder पर एक फाइल बनाने की जरूरत है :

# appName/apps.py

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

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

डिफ़ॉल्ट रूप से इस AppConfig उपवर्ग को लोड करने के लिए:

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

करने का सबसे अच्छा तरीका है। Django 1.7 पर परीक्षण किया गया

मेरा कस्टम ऐप नाम

उस व्यक्ति के लिए जिसे स्पैनिश की समस्या थी

यह कोड python2 स्क्रिप्ट पर utf-8 संगतता को सक्षम करता है

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

बस कुछ पांडित्य पक्ष-नोट्स: नाम apps.pyकी फ़ाइल बनाना अनिवार्य नहीं है। कोई भी नाम ठीक है (लेकिन आपको इसे संदर्भित करना होगा __init__.py)। जैसा कि पहले ही अन्य टिप्पणियों में कहा गया है, यह कोड django> = 1.7 ( docs.djangoproject.com/en/1.7/ref/applications/… ) के लिए काम करता है ।
furins

यह अच्छी तरह से woks, लेकिन init .py फ़ाइल में कोड की आवश्यकता नहीं है अगर आप INTALLED_APPS में Django पुनर्संयोजन उदाहरण के रूप में एप्लिकेशन इंस्टॉल करते हैं: 'App_name.apps.AppnameConfig'
सोलिस

6

नहीं, लेकिन आप व्यवस्थापक टेम्प्लेट की प्रतिलिपि बना सकते हैं और वहां एप्लिकेशन का नाम निर्धारित कर सकते हैं।


3

एक हैक किया जा सकता है जिसे किसी भी माइग्रेशन की आवश्यकता नहीं है। इयोनेल के ब्लॉग से लिया गया और इसका श्रेय उन्हें जाता है: http://blog.ionelmc.ro/2011/06/24/custom-app-names-in-the-django-admin/

इसके लिए एक टिकट भी है जिसे Django 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'

आपके पास verbose_name है, हालाँकि आप व्यवस्थापन में अलग प्रदर्शन के लिए app_label को भी अनुकूलित करना चाहते हैं। Unfortunatelly कुछ मनमाना स्ट्रिंग (रिक्त स्थान के साथ) काम नहीं करता है और यह वैसे भी प्रदर्शन के लिए नहीं है।

यह बताता है कि व्यवस्थापक app_label का उपयोग करता है। शीर्षक () प्रदर्शन के लिए इसलिए हम थोड़ा हैक कर सकते हैं: स्ट्रिड उपवर्ग को ओवरराइड शीर्षक विधि के साथ:

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

यदि आपके पास पुराने ऐप नाम का उपयोग करके पहले से ही मौजूद टेबल हैं, और आप उन्हें माइग्रेट नहीं करना चाहते हैं, तो बस मूल मॉडल के प्रॉक्सी पर app_label सेट करें।

class MyOldModel(models.Model):
    pass

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

फिर आपको इसे अपने admin.py में बदलना होगा:

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

ध्यान रखें कि url / admin / NewAPPname / mynewmodel / होगा, इसलिए आप केवल यह सुनिश्चित करना चाहते हैं कि नए मॉडल का वर्ग नाम जितना संभव हो उतना पुराने मॉडल के करीब दिखाई दे।


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फ़ंक्शन को एक सहायक फ़ाइल में बदलना चाहिए ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.