คุณสามารถตั้งชื่อ verbose ให้กับแอพ Django ทั่วทั้งผู้ดูแลได้หรือไม่?


140

เช่นเดียวกับที่คุณสามารถให้ชื่อฟิลด์และแบบจำลองที่ปรากฏในผู้ดูแลระบบ Django คุณสามารถตั้งชื่อที่กำหนดเองให้แอปได้หรือไม่


4
ตั๋วนี้จะอยู่นี้: code.djangoproject.com/ticket/3591 แต่น่าเสียดายที่มันไม่ได้ดูเหมือนมันจะนำไปรวมใน Django ในเร็ว ๆ นี้ ...
เบนจามิน Wohlwend

10
ในฐานะของ Django 1.7 นี่เป็นไปได้ที่จะออกนอกกรอบ - ดูdocs.djangoproject.com/en/1.7/ref/applications/ …
rhunwicks

คำตอบ:


182

Django 1.8+

ตามเอกสาร 1.8ฉบับ(และเอกสารปัจจุบัน )

default_app_configการใช้งานใหม่ควรหลีกเลี่ยง แต่พวกเขาควรจะต้องมีเส้นทางประเพื่อที่เหมาะสมAppConfigsubclass INSTALLED_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'

12
ฉันมีปัญหากับสิ่งนี้ในผู้ดูแลระบบ มากขึ้นอยู่กับ app_label ว่าเมื่อฉันเริ่มเปลี่ยนชื่อมันทำลายสิ่งนั้น
Joe J

ฉันรู้ว่าฉันลงเอยด้วยการเขียนเทมเพลทซึ่งมี dict ด้วย app_url: app_name binding
Frost.baka

58
หมายเหตุนี่ไม่เหมือนกับชื่อ verbose ในแง่ที่ว่าจะมีผลกับสิ่งที่แสดงให้ผู้ใช้เห็นเท่านั้น เป็นสตริงตัวอักษรที่ใช้ตั้งชื่อตารางในฐานข้อมูลซึ่งต้องมีการโยกย้ายสคีมาหากคุณกำลังเปลี่ยนรูปแบบที่มีอยู่
Cerin

6
ฉันไม่คิดว่านี่เป็นทางออกที่ดี มันมีผลข้างเคียงอื่น ๆ มากมายที่ไม่เกี่ยวกับสุนทรียศาสตร์
David Sanders

คำตอบยอดนิยมนี้แนะนำให้ใช้แฮ็ค / วิธีแก้ปัญหาที่จำเป็นก่อน Django 1.7 หากคุณใช้ 1.7 ขึ้นไปให้ใช้ไฟล์ apps.py ตามคำแนะนำด้านล่างโดย iMaGiNiX
shacker

38

ตามที่ระบุไว้โดยความเห็นของ 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'

มันทำงานได้ดี แต่ไม่จำเป็นต้องใช้รหัสในไฟล์init .py หากคุณติดตั้งแอปพลิเคชั่นเป็นตัวอย่างการแนะนำของ Django ใน INTALLED_APPS: 'App_name.apps.AppnameConfig'
Roberth Solís

31

หากคุณมีโมเดลมากกว่าหนึ่งรุ่นในแอปให้สร้างโมเดลด้วยข้อมูล Meta และสร้างคลาสย่อยของคลาสนั้นสำหรับทุกรุ่นของคุณ

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 ลงในมุมมอง 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

ในขณะที่คุณปรับแต่งมุมมองดัชนีทำไมไม่เพิ่มคุณสมบัติ 'คำสั่งซื้อ' ด้วย


12

ดีฉันเริ่มต้นแอปที่เรียกว่าสิ่งที่ต้องทำและได้ตัดสินใจตอนนี้ผมอยากให้มันเป็นชื่องาน ปัญหาคือฉันมีข้อมูลอยู่ในตารางแล้วดังนั้นการทำงานของฉันก็มีดังนี้ วางลงใน models.py:

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

หวังว่ามันจะช่วย


7

สำหรับ 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 มันไม่ได้แก้ไขเศษขนมปังในมุมมองผู้ดูแลระบบอื่น ๆ ทั้งหมด


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

ชื่อแอปที่กำหนดเองของฉัน

สำหรับคนที่มีปัญหากับภาษาสเปน

รหัสนี้เปิดใช้งานความเข้ากันได้ utf-8 ในสคริปต์ python2

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

หมายเหตุด้านอวดความรู้บางส่วนเท่านั้น: การสร้างไฟล์ชื่อapps.pyนั้นไม่บังคับ ชื่อใดก็ได้ (แต่คุณต้องอ้างอิงใน__init__.py) ตามที่ระบุไว้แล้วในความคิดเห็นอื่น ๆ รหัสนี้ใช้งานได้สำหรับ django> = 1.7 ( docs.djangoproject.com/en/1.7/ref/applications/… )
furins

มันทำงานได้ดี แต่ไม่จำเป็นต้องใช้รหัสในไฟล์init .py หากคุณติดตั้งแอปพลิเคชั่นเป็นตัวอย่างการแนะนำของ Django ใน INTALLED_APPS: 'App_name.apps.AppnameConfig'
Roberth Solís

6

ไม่ แต่คุณสามารถคัดลอกเทมเพลตผู้ดูแลระบบและกำหนดชื่อแอพได้


3

มีแฮ็กที่สามารถทำได้ซึ่งไม่ต้องการการโยกย้ายใด ๆ นำมาจากบล็อกและเครดิตของ 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'

และผู้ดูแลระบบจะแสดง "กล่องข้อมูล" เป็นชื่อแอป

"""


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

นี่มันใช้งานได้สำหรับฉัน ใน 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',

]


0

ชิ้น 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เป็นไฟล์ผู้ช่วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.