python - pelicula - django windows
¿Puedes darle a una aplicación Django un nombre detallado para usar en todo el administrador? (12)
Bueno, comencé una aplicación llamada todo y ahora decidí que quería que se llamara Tareas . El problema es que ya tengo datos dentro de mi mesa, así que mi trabajo fue el siguiente. Colocado en el models.py:
class Meta:
app_label = ''Tasks''
db_table = ''mytodo_todo''
Espero eso ayude.
De la misma manera que puede dar campos y modelos de nombres detallados que aparecen en el administrador de Django, ¿puede darle a la aplicación un nombre personalizado?
Dales una propiedad verbose_name.
No te hagas ilusiones. También deberá copiar la vista de índice de django.contrib.admin.sites en su propia vista de ProjectAdminSite e incluirla en su propia instancia de administración personalizada:
class ProjectAdminSite(AdminSite):
def index(self, request, extra_context=None):
copied stuff here...
admin.site = ProjectAdminSite()
luego modifique la vista copiada para que use su propiedad verbose_name como la etiqueta de la aplicación.
Lo hice agregando algo así como esto a la vista copiada:
try:
app_name = model_admin.verbose_name
except AttributeError:
app_name = app_label
Mientras ajusta la vista de índice, ¿por qué no agrega también una propiedad de ''orden''?
El siguiente código plug-and-play funciona perfectamente desde Django 1.7
. Todo lo que tiene que hacer es copiar el siguiente código en el archivo __init__.py
de la aplicación específica y cambiar el parámetro 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''
Si usa esto para varias aplicaciones, debe factorizar la función get_current_app_name
en un archivo auxiliar.
Estoy usando django-admin-tools para eso.
Hay un truco que se puede hacer que no requiere migraciones. Tomado del blog de Ionel y el crédito va para él: http://blog.ionelmc.ro/2011/06/24/custom-app-names-in-the-django-admin/
También hay un boleto para esto que debería arreglarse en Django 1.7 https://code.djangoproject.com/ticket/3591
"" "
Supongamos que tiene un modelo como este:
class Stuff(models.Model):
class Meta:
verbose_name = u''The stuff''
verbose_name_plural = u''The bunch of stuff''
Tiene verbose_name, sin embargo, también desea personalizar app_label para que se muestre de forma diferente en admin. Desafortunadamente tener alguna cadena arbitraria (con espacios) no funciona y no es para mostrar de todos modos.
Resulta que el administrador usa app_label. title () para mostrar para que podamos hacer una pequeña hack: str subclass con el método de título reemplazado:
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
Ahora podemos tener el modelo así:
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''
y el administrador mostrará "The stuff box" como el nombre de la aplicación.
"" "
No, pero puedes copiar la plantilla de administrador y definir el nombre de la aplicación allí.
Para Django 1.4 (aún no lanzado, pero el tronco es bastante estable), puede usar el siguiente método. Se basa en el hecho de que AdminSite ahora devuelve una TemplateResponse, que puede modificar antes de que se represente.
Aquí, hacemos un poco de parche de mono para insertar nuestro comportamiento, lo cual se puede evitar si usa una subclase de AdminSite personalizada.
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)
Esto arregla el índice y las vistas de app_index. No arregla las migas de pan en todas las demás vistas de administrador.
Primero necesitas crear un archivo apps.py
como este en tu carpeta de aplicaciones:
# appName/apps.py
# -*- coding: utf-8 -*-
from django.apps import AppConfig
class AppNameConfig(AppConfig):
name = ''appName''
verbose_name = "app Custom Name"
Para cargar esta subclase AppConfig de forma predeterminada:
# appName/__init__.py
default_app_config = ''appName.apps.AppNameConfig''
Es la mejor manera de hacerlo probado en Django 1.7
Para la persona que tuvo problemas con el español
Este código habilita la compatibilidad con utf-8 en scripts python2
# -*- coding: utf-8 -*-
Según lo declarado por el comentario de rhunwicks a OP, ahora esto es posible de forma inmediata ya que Django 1.7
Tomado de los docs.djangoproject.com/en/1.7/ref/applications/… :
# in yourapp/apps.py
from django.apps import AppConfig
class YourAppConfig(AppConfig):
name = ''yourapp''
verbose_name = ''Fancy Title''
luego establezca la variable default_app_config
en YourAppConfig
# in yourapp/__init__.py
default_app_config = ''yourapp.apps.YourAppConfig''
Si tiene más de un modelo en la aplicación, solo cree un modelo con la información Meta y cree subclases de esa clase para todos sus modelos.
class MyAppModel(models.Model):
class Meta:
app_label = ''My App Label''
abstract = True
class Category(MyAppModel):
name = models.CharField(max_length=50)
Si ya tiene tablas existentes que usan el nombre de la aplicación anterior y no desea migrarlas, simplemente configure app_label en un proxy del modelo original.
class MyOldModel(models.Model):
pass
class MyNewModel(MyOldModel):
class Meta:
proxy = True
app_label = ''New APP name''
verbose_name = MyOldModel._meta.verbose_name
Entonces solo tienes que cambiar esto en tu admin.py:
#admin.site.register(MyOldModel, MyOldModelAdmin)
admin.site.register(MyNewModel, MyOldModelAdmin)
Tenga en cuenta que la URL será / admin / NewAPPname / mynewmodel / por lo que es posible que desee asegurarse de que el nombre de clase para el nuevo modelo se ve lo más parecido posible al modelo anterior.
Antes de Django 1.7
Puede darle a su aplicación un nombre personalizado definiendo etiqueta de aplicación en la definición de su modelo. Pero a medida que django construye la página de administración, cambiará los modelos por su etiqueta_aplicación, por lo que si desea que aparezcan en una aplicación, debe definir este nombre en todos los modelos de su aplicación.
class MyModel(models.Model):
pass
class Meta:
app_label = ''My APP name''
Django 1.7+
Según lo declarado por el comentario de rhunwicks a OP, ahora esto es posible de forma inmediata ya que Django 1.7
Tomado de los docs.djangoproject.com/en/1.7/ref/applications/… :
# in yourapp/apps.py
from django.apps import AppConfig
class YourAppConfig(AppConfig):
name = ''yourapp''
verbose_name = ''Fancy Title''
luego establezca la variable default_app_config
en YourAppConfig
# in yourapp/__init__.py
default_app_config = ''yourapp.apps.YourAppConfig''