इसी तरह से आप Django के व्यवस्थापक में दिखाई देने वाले फ़ील्ड और मॉडल क्रिया नाम दे सकते हैं, क्या आप किसी ऐप को कस्टम नाम दे सकते हैं?
इसी तरह से आप Django के व्यवस्थापक में दिखाई देने वाले फ़ील्ड और मॉडल क्रिया नाम दे सकते हैं, क्या आप किसी ऐप को कस्टम नाम दे सकते हैं?
जवाबों:
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'
जैसा कि ओपी को 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'
यदि आपके पास ऐप में एक से अधिक मॉडल हैं तो बस मेटा जानकारी के साथ एक मॉडल बनाएं और अपने सभी मॉडलों के लिए उस वर्ग के उपवर्ग बनाएं।
class MyAppModel(models.Model):
class Meta:
app_label = 'My App Label'
abstract = True
class Category(MyAppModel):
name = models.CharField(max_length=50)
उन्हें एक 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
जब आप इंडेक्स व्यू को ट्विक कर रहे हैं तो एक 'ऑर्डर' प्रॉपर्टी को भी क्यों न जोड़ें।
वैसे मैंने टूडू नाम से एक ऐप शुरू किया है और अब तय किया है कि मैं चाहता हूं कि इसका नाम टास्क रखा जाए । समस्या यह है कि मेरे पास पहले से ही मेरी तालिका के भीतर डेटा है इसलिए मेरा काम इस प्रकार था। मॉडल थ्रेड में रखा गया:
class Meta:
app_label = 'Tasks'
db_table = 'mytodo_todo'
आशा करता हूँ की ये काम करेगा।
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 विचारों को ठीक करता है। यह अन्य सभी व्यवस्थापक विचारों में ब्रेड के टुकड़ों को ठीक नहीं करता है।
सबसे पहले आपको 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/… ) के लिए काम करता है ।
एक हैक किया जा सकता है जिसे किसी भी माइग्रेशन की आवश्यकता नहीं है। इयोनेल के ब्लॉग से लिया गया और इसका श्रेय उन्हें जाता है: 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'
और व्यवस्थापक ऐप नाम के रूप में "सामान बॉक्स" दिखाएगा।
"" "
यदि आपके पास पुराने ऐप नाम का उपयोग करके पहले से ही मौजूद टेबल हैं, और आप उन्हें माइग्रेट नहीं करना चाहते हैं, तो बस मूल मॉडल के प्रॉक्सी पर 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 / होगा, इसलिए आप केवल यह सुनिश्चित करना चाहते हैं कि नए मॉडल का वर्ग नाम जितना संभव हो उतना पुराने मॉडल के करीब दिखाई दे।
खैर, यह मेरे लिए काम करता है। इस एप्लिकेशन का उपयोग करें:
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',
]
निम्नलिखित प्लग-एंड-प्ले कोड कोड पूरी तरह से काम करता है 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
फ़ंक्शन को एक सहायक फ़ाइल में बदलना चाहिए ।