เช่นเดียวกับที่คุณสามารถให้ชื่อฟิลด์และแบบจำลองที่ปรากฏในผู้ดูแลระบบ Django คุณสามารถตั้งชื่อที่กำหนดเองให้แอปได้หรือไม่
เช่นเดียวกับที่คุณสามารถให้ชื่อฟิลด์และแบบจำลองที่ปรากฏในผู้ดูแลระบบ Django คุณสามารถตั้งชื่อที่กำหนดเองให้แอปได้หรือไม่
คำตอบ:
Django 1.8+
ตามเอกสาร 1.8ฉบับ(และเอกสารปัจจุบัน )
default_app_config
การใช้งานใหม่ควรหลีกเลี่ยง แต่พวกเขาควรจะต้องมีเส้นทางประเพื่อที่เหมาะสมAppConfig
subclassINSTALLED_APPS
ที่จะกำหนดค่าอย่างชัดเจนใน
ตัวอย่าง:
INSTALLED_APPS = [
# ...snip...
'yourapp.apps.YourAppConfig',
]
จากนั้นแก้ไขของคุณAppConfig
ตามที่ระบุไว้ด้านล่าง
Django 1.7
ตามที่ระบุไว้โดยความเห็นของ rhunwicks ต่อ OP ตอนนี้สามารถทำได้ตั้งแต่ใน 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'
ตามที่ระบุไว้โดยความเห็นของ rhunwicks ต่อ OP ตอนนี้สามารถทำได้ตั้งแต่ใน 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'
หากคุณมีโมเดลมากกว่าหนึ่งรุ่นในแอปให้สร้างโมเดลด้วยข้อมูล Meta และสร้างคลาสย่อยของคลาสนั้นสำหรับทุกรุ่นของคุณ
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 ลงในมุมมอง ProjectAdminSite ของคุณเองและรวมไว้ในอินสแตนซ์ผู้ดูแลระบบที่คุณกำหนดเอง:
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
ในขณะที่คุณปรับแต่งมุมมองดัชนีทำไมไม่เพิ่มคุณสมบัติ 'คำสั่งซื้อ' ด้วย
ดีฉันเริ่มต้นแอปที่เรียกว่าสิ่งที่ต้องทำและได้ตัดสินใจตอนนี้ผมอยากให้มันเป็นชื่องาน ปัญหาคือฉันมีข้อมูลอยู่ในตารางแล้วดังนั้นการทำงานของฉันก็มีดังนี้ วางลงใน models.py:
class Meta:
app_label = 'Tasks'
db_table = 'mytodo_todo'
หวังว่ามันจะช่วย
สำหรับ Django 1.4 (ยังไม่วางจำหน่าย แต่ลำตัวค่อนข้างเสถียร) คุณสามารถใช้วิธีการต่อไปนี้ ขึ้นอยู่กับข้อเท็จจริงที่ว่า AdminSite ส่งคืน TemplateResponse ซึ่งคุณสามารถเปลี่ยนแปลงได้ก่อนที่จะแสดงผล
ที่นี่เราทำการปะแก้ลิงเล็กน้อยเพื่อแทรกพฤติกรรมของเราซึ่งสามารถหลีกเลี่ยงได้หากคุณใช้คลาสย่อย AdminSite ที่กำหนดเอง
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
สำหรับคนที่มีปัญหากับภาษาสเปน
รหัสนี้เปิดใช้งานความเข้ากันได้ utf-8 ในสคริปต์ python2
# -*- coding: utf-8 -*-
apps.py
นั้นไม่บังคับ ชื่อใดก็ได้ (แต่คุณต้องอ้างอิงใน__init__.py
) ตามที่ระบุไว้แล้วในความคิดเห็นอื่น ๆ รหัสนี้ใช้งานได้สำหรับ django> = 1.7 ( docs.djangoproject.com/en/1.7/ref/applications/… )
ไม่ แต่คุณสามารถคัดลอกเทมเพลตผู้ดูแลระบบและกำหนดชื่อแอพได้
มีแฮ็กที่สามารถทำได้ซึ่งไม่ต้องการการโยกย้ายใด ๆ นำมาจากบล็อกและเครดิตของ Ionel ไปหาเขา: 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 ด้วยเช่นกันสำหรับการแสดงผลที่แตกต่างในผู้ดูแลระบบ โชคไม่ดีที่มีสตริงตามอำเภอใจ (พร้อมช่องว่าง) ใช้งานไม่ได้และไม่สามารถแสดงได้
ปรากฎว่าผู้ดูแลระบบใช้ app_label หัวเรื่อง () สำหรับการแสดงผลเพื่อให้เราสามารถทำการแฮ็กเล็กน้อย: str subclass ด้วยวิธี overriden title:
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 / ดังนั้นคุณอาจต้องตรวจสอบให้แน่ใจว่าชื่อคลาสของโมเดลใหม่นั้นใกล้เคียงกับโมเดลเก่าที่สุดเท่าที่จะเป็นไปได้
นี่มันใช้งานได้สำหรับฉัน ใน app.py ใช้สิ่งนี้:
class MainConfig(AppConfig):
name = 'main'
verbose_name="Fancy Title"
ใน setting.py เพิ่มชื่อของแอพและชื่อคลาสที่มีอยู่ในไฟล์ app.py ในโฟลเดอร์แอพ
INSTALLED_APPS = [
'main.apps.MainConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
ชิ้น Plug-and-play 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
เป็นไฟล์ผู้ช่วย