যেভাবে আপনি জ্যাঙ্গো অ্যাডমিনে প্রদর্শিত ক্ষেত্র এবং মডেলগুলি ভার্বোজের নাম দিতে পারেন, আপনি কি কোনও অ্যাপ্লিকেশনকে কাস্টম নাম দিতে পারেন?
যেভাবে আপনি জ্যাঙ্গো অ্যাডমিনে প্রদর্শিত ক্ষেত্র এবং মডেলগুলি ভার্বোজের নাম দিতে পারেন, আপনি কি কোনও অ্যাপ্লিকেশনকে কাস্টম নাম দিতে পারেন?
উত্তর:
জ্যাঙ্গো 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'
ওপিকে রনউইকসের মন্তব্যে যেমন বলা হয়েছে, জ্যাঙ্গো ১.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 সম্পত্তি দিন।
আপনার আশা না পেতে। আপনাকে 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
আপনি যখন সূচক দেখুনটি টুইট করছেন তখন কেন 'আদেশ' সম্পত্তিটি যুক্ত করবেন না।
ওয়েল, আমি টোডো নামে একটি অ্যাপ্লিকেশন শুরু করেছি এবং এখন সিদ্ধান্ত নিয়েছি যে আমি এটির নাম টাস্ক রাখি । সমস্যাটি হ'ল আমার টেবিলের মধ্যে আমার কাছে ইতিমধ্যে ডেটা রয়েছে তাই আমার কাজটি নিম্নরূপ ছিল। মডেলগুলিতে স্থাপন করা হয়েছে: পিপি:
class Meta:
app_label = 'Tasks'
db_table = 'mytodo_todo'
আশা করি এটা সাহায্য করবে.
জাজানো ১.৪ এর জন্য (এখনও প্রকাশিত হয়নি, তবে ট্রাঙ্কটি বেশ স্থিতিশীল), আপনি নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন। এটি নির্ভর করে যে অ্যাডমিনসাইট এখন একটি টেম্পলেট রিস্পনস দেয়, যা আপনি এটি রেন্ডার করার আগে পরিবর্তন করতে পারেন।
এখানে, আমরা আমাদের আচরণ সন্নিবেশ করার জন্য একটি ছোট্ট কিছু বানর প্যাচিং করি, যা আপনি যদি কাস্টম অ্যাডমিনসাইট সাবক্লাস ব্যবহার করেন তবে এড়ানো যায়।
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)
এটি সূচক এবং অ্যাপ_আইডেক্সের দর্শনগুলি স্থির করে। এটি অন্যান্য সমস্ত অ্যাডমিন দর্শনগুলিতে রুটির ক্র্যাম্বস ঠিক করে না।
প্রথমে আপনাকে 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/… ) এর জন্য কাজ করে।
এমন একটি হ্যাক রয়েছে যা করতে কোনও মাইগ্রেশন প্রয়োজন হয় না। আয়নেলের ব্লগ থেকে নেওয়া এবং কৃতিত্ব তার কাছে যায়: 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'
এবং প্রশাসক অ্যাপ্লিকেশনটির নাম হিসাবে "স্টাফ বক্স" প্রদর্শন করবে।
"" "
যদি আপনার কাছে ইতিমধ্যে পুরানো অ্যাপ্লিকেশন নামটি ব্যবহার করে বিদ্যমান সারণী রয়েছে এবং আপনি সেগুলি স্থানান্তর করতে চান না, তবে কেবলমাত্র আসল মডেলের একটি প্রক্সিতে অ্যাপ_লাবেল সেট করুন।
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)
ইউআরএলটি / অ্যাডমিন / নিউএপপ্লেম / মেনিউমডেল হবে / তাই আপনি কেবল এটি নিশ্চিত করতে চাইতে পারেন যে নতুন মডেলের ক্লাসের নামটি পুরানো মডেলের যতটা সম্ভব দেখতে পেয়েছে।
ঠিক আছে, এটি আমার পক্ষে কাজ করে। অ্যাপ.পি-তে এটি ব্যবহার করুন:
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
ফাংশনটি কোনও সহায়ক ফাইলে ফ্যাক্ট করতে হবে।