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?
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?
Câu trả lời:
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ớiAppConfig
lớp con thích hợp được cấu hình rõ ràng trongINSTALLED_APPS
.
Thí dụ:
INSTALLED_APPS = [
# ...snip...
'yourapp.apps.YourAppConfig',
]
Sau đó thay đổi của bạn AppConfig
như đượ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_config
biế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'
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_config
biến thànhYourAppConfig
# in yourapp/__init__.py
default_app_config = 'yourapp.apps.YourAppConfig'
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)
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'.
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.
Đố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.
Trước tiên, bạn cần tạo một apps.py
tệ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
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 -*-
apps.py
là 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 ).
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.
"" "
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.
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',
]
Đ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__.py
tệp của ứng dụng cụ thể và thay đổi VERBOSE_APP_NAME
tham 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_name
chức năng cho một tệp trợ giúp.