Bạn có thể cung cấp cho ứng dụng Django một tên dài dòng để sử dụng trong toàn bộ quản trị viên không?


140

Theo cùng một cách mà bạn có thể cung cấp cho các trường và mô hình tên dài dòng xuất hiện trong quản trị viên Django, bạn có thể đặt cho ứng dụng một tên tùy chỉnh không?


4
Vé này sẽ giải quyết điều này: code.djangoproject.com/ticket/3591 . Thật không may, có vẻ như nó sẽ không được tích hợp vào Django bất cứ lúc nào sớm ...
Benjamin Wohlwend

10
Tính đến Django 1,7 này bây giờ có thể ra khỏi hộp - xem docs.djangoproject.com/en/1.7/ref/applications/...
rhunwicks

Câu trả lời:


182

Django 1.8+

Theo 1,8 tài liệu (và tài liệu hiện tại ),

Các ứng dụng mới nên tránh default_app_config. Thay vào đó, họ nên yêu cầu đường dẫn chấm tới AppConfiglớp con thích hợp được cấu hình rõ ràng trong INSTALLED_APPS.

Thí dụ:

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

Sau đó thay đổi của bạn AppConfignhư được liệt kê dưới đây.

Django 1.7

Như đã nêu trong nhận xét của rhunwicks cho OP, giờ đây điều này có thể vượt ra khỏi Django 1.7

Lấy từ các tài liệu :

# in yourapp/apps.py
from django.apps import AppConfig

class YourAppConfig(AppConfig):
    name = 'yourapp'
    verbose_name = 'Fancy Title'

sau đó đặt default_app_configbiến thànhYourAppConfig

# in yourapp/__init__.py
default_app_config = 'yourapp.apps.YourAppConfig'

Trước Django 1.7

Bạn có thể đặt cho ứng dụng của mình một tên tùy chỉnh bằng cách xác định app_label trong định nghĩa mô hình của bạn. Nhưng khi django xây dựng trang quản trị, nó sẽ băm các mô hình bằng app_label của họ, vì vậy nếu bạn muốn chúng xuất hiện trong một ứng dụng, bạn phải xác định tên này trong tất cả các mô hình ứng dụng của mình.

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

12
Tôi đã gặp rắc rối với điều này trong quản trị viên. Rất nhiều phụ thuộc vào app_label mà khi tôi bắt đầu thay đổi tên, nó đã phá vỡ thứ đó.
Joe J

Tôi biết, cuối cùng tôi đã viết một templatag có một lệnh với ràng buộc app_url: app_name.
Frost.baka

58
Lưu ý, đây KHÔNG giống như một tên dài dòng, theo nghĩa là nó chỉ ảnh hưởng đến những gì được hiển thị cho người dùng. Đó là chuỗi ký tự được sử dụng để đặt tên bảng trong cơ sở dữ liệu, yêu cầu di chuyển lược đồ nếu bạn đang thay đổi một mô hình hiện có.
Cerin

6
Tôi không nghĩ rằng đây là một giải pháp tốt. Nó có quá nhiều tác dụng phụ khác không mang tính thẩm mỹ.
David Sanders

Câu trả lời phổ biến này khuyên bạn nên sử dụng hack / cách khắc phục cần thiết trước Django 1.7. Nếu bạn đang sử dụng 1.7 trở lên, hãy sử dụng tệp apps.py như được đề xuất bên dưới bởi iMaGiNiX.
shacker

38

Như đã nêu trong nhận xét của rhunwicks cho OP, giờ đây điều này có thể vượt ra khỏi Django 1.7

Lấy từ các tài liệu :

# in yourapp/apps.py
from django.apps import AppConfig

class YourAppConfig(AppConfig):
    name = 'yourapp'
    verbose_name = 'Fancy Title'

sau đó đặt default_app_configbiến thànhYourAppConfig

# in yourapp/__init__.py
default_app_config = 'yourapp.apps.YourAppConfig'

Nó hoạt động tốt, nhưng mã trong tệp init .py không bắt buộc nếu bạn cài đặt ứng dụng làm ví dụ giới thiệu Django trong INTALLED_APPS: 'App_name.apps.AppnameConfig'
Roberth Solís 27/03/18

31

Nếu bạn có nhiều hơn một mô hình trong ứng dụng, chỉ cần tạo một mô hình với thông tin Meta và tạo các lớp con của lớp đó cho tất cả các mô hình của bạn.

class MyAppModel(models.Model):
    class Meta:
        app_label = 'My App Label'
        abstract = True

class Category(MyAppModel):
     name = models.CharField(max_length=50)

12

Cung cấp cho họ một tài sản verbose_name.

Đừng hy vọng. Bạn cũng sẽ cần sao chép chế độ xem chỉ mục từ django.contrib.admin.sites vào chế độ xem ProjectAdminSite của riêng bạn và đưa nó vào ví dụ quản trị viên tùy chỉnh của riêng bạn:

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

admin.site = ProjectAdminSite()

sau đó điều chỉnh chế độ xem được sao chép để nó sử dụng thuộc tính verbose_name của bạn làm nhãn cho ứng dụng.

Tôi đã làm điều đó bằng cách thêm một cái gì đó giống như thế này vào chế độ xem được sao chép:

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

Trong khi bạn đang điều chỉnh chế độ xem chỉ mục, tại sao không thêm thuộc tính 'đặt hàng'.


12

Vâng, tôi đã bắt đầu một ứng dụng được gọi là todo và bây giờ đã quyết định tôi muốn nó được đặt tên là Nhiệm vụ . Vấn đề là tôi đã có dữ liệu trong bảng của mình nên công việc của tôi như sau. Được đặt vào mô hình:

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

Hy vọng nó giúp.


7

Đối với Django 1.4 (chưa được phát hành, nhưng thân cây khá ổn định), bạn có thể sử dụng phương pháp sau. Nó phụ thuộc vào thực tế là AdminSite hiện trả về một TemplateResponse, mà bạn có thể thay đổi trước khi nó được hiển thị.

Ở đây, chúng tôi thực hiện một chút vá khỉ để chèn hành vi của chúng tôi, điều này có thể tránh được nếu bạn sử dụng lớp con AdminSite tùy chỉnh.

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)

Điều này sửa chỉ mục và các khung nhìn app_index. Nó không sửa các mẩu bánh mì trong tất cả các chế độ xem khác của quản trị viên.


7

Trước tiên, bạn cần tạo một apps.pytệp như thế này trên appfolder của bạn:

# appName/apps.py

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

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

Để tải lớp con AppConfig này theo mặc định:

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

Là cách tốt nhất để làm. thử nghiệm trên Django 1.7

Tên ứng dụng tùy chỉnh của tôi

Dành cho người gặp vấn đề với người Tây Ban Nha

Mã này cho phép khả năng tương thích utf-8 trên các tập lệnh python2

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

Chỉ cần một vài ghi chú bên phạm vi: tạo một tệp có tên apps.pylà không bắt buộc. Bất kỳ tên nào cũng được (nhưng bạn phải tham khảo nó trong __init__.py). Như đã nêu trong các nhận xét khác, mã này hoạt động cho django> = 1.7 ( docs.djangoproject.com/en/1.7/ref/appluggest/ Lỗi ).
furins 2/2/2015

Nó hoạt động tốt, nhưng mã trong tệp init .py không bắt buộc nếu bạn cài đặt ứng dụng làm ví dụ giới thiệu Django trong INTALLED_APPS: 'App_name.apps.AppnameConfig'
Roberth Solís 27/03/18

6

Không, nhưng bạn có thể sao chép mẫu quản trị và xác định tên ứng dụng ở đó.


3

Có một hack có thể được thực hiện mà không cần bất kỳ sự di chuyển nào. Lấy từ blog và tín dụng của Ionel gửi cho anh ấy: http://blog.ionelmc.ro/2011/06/24/custom-app-names-in-the-django-admin/

Ngoài ra còn có một vé cho điều này nên được sửa trong Django 1.7 https://code.djangoproject.com/ticket/3591

"" "

Giả sử bạn có một mô hình như thế này:

class Stuff(models.Model):
    class Meta:
        verbose_name = u'The stuff'
        verbose_name_plural = u'The bunch of stuff'

Bạn có verbose_name, tuy nhiên bạn cũng muốn tùy chỉnh app_label để hiển thị khác nhau trong quản trị viên. Không may có một số chuỗi tùy ý (có dấu cách) không hoạt động và dù sao nó cũng không hiển thị.

Hóa ra là quản trị viên sử dụng app_label. title () để hiển thị để chúng ta có thể thực hiện một chút hack: str lớp con với phương thức tiêu đề overriden:

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

Bây giờ chúng ta có thể có mô hình như thế này:

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'

và quản trị viên sẽ hiển thị "Hộp thứ" dưới dạng tên ứng dụng.

"" "


2

Nếu bạn đã có các bảng hiện có bằng tên ứng dụng cũ và bạn không muốn di chuyển chúng, thì chỉ cần đặt app_label trên proxy của mô hình ban đầu.

class MyOldModel(models.Model):
    pass

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

Sau đó, bạn chỉ cần thay đổi điều này trong admin.txt của bạn:

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

Xin lưu ý rằng url sẽ là / admin / NewAPPname / mynewmodel / vì vậy bạn có thể chỉ muốn đảm bảo rằng tên lớp cho mô hình mới trông càng gần với mô hình cũ càng tốt.


1

Vâng, điều này làm việc cho tôi. Trong app.py sử dụng điều này:

class MainConfig(AppConfig):
    name = 'main'
    verbose_name="Fancy Title"

Trong cài đặt, hãy thêm tên của Ứng dụng và tên lớp có trong tệp app.py trong thư mục Ứng dụng

INSTALLED_APPS = [
    'main.apps.MainConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

]


0

Đoạn mã plug-and-play sau đây hoạt động hoàn hảo kể từ đó Django 1.7. Tất cả bạn phải làm là sao chép mã dưới đây trong __init__.pytệp của ứng dụng cụ thể và thay đổi VERBOSE_APP_NAMEtham số.

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'

Nếu bạn sử dụng điều này cho nhiều ứng dụng, bạn nên đưa ra get_current_app_namechức năng cho một tệp trợ giúp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.