Pregunta ¿Cómo formatear DateTimeField en Django Admin para localtime?


¿Cómo formatear DateTimeField en Admin según localtime y timezone?

Mi settings.py:

    TIME_ZONE = 'Europe/Bratislava'
    LANGUAGE_CODE = 'en-us'
    USE_I18N = True
    USE_L10N = True
    USE_TZ = True

el paquete pytz está instalado.

modelo:

class Material(models.Model):
    category = models.ForeignKey(Category, null=True, blank=True) 
    code = models.CharField(max_length=10)
    description = models.CharField(max_length=30, blank=True, null=True)
    modified = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

También intenté algunos formatos de fecha en la configuración, nada de esto cambió la forma en que el objeto datetime se convierte a cadena en la visualización de la lista de administración:

DATETIME_FORMAT = 'd N Y'
DATE_FORMAT = 'd N Y'

En la base de datos, la fecha y hora se almacena correctamente, "2012-11-20 08: 57: 15.901341 + 01". Pero cuando se muestra en el administrador, siempre está en UTC.

Puedo preparar métodos en ModelAdmin para manejar el formato, pero eso no es realmente SECO, ya que me gustaría que mis clases de administración se vean así:

from django.utils.timezone import localtime

class MaterialAdmin(admin.ModelAdmin):
    list_display = ('code', 'modified_local', 'created')

    def modified_local(self, row):
        return localtime(row.modified)
    modified_local.admin_order_field = 'modified'
    modified_local.short_description = 'Modified'

6
2017-11-20 09:33


origen


Respuestas:


La respuesta a tu pregunta es la correcta configuración de settings y formats en el proyecto Django. Estructura del proyecto de ejemplo:

.
|-- README.md
|-- demo.db
|-- demo_time_set
|   |-- __init__.py
|   |-- demo.db
|   |-- formats
|   |   |-- __init__.py
|   |   `-- en
|   |       |-- __init__.py
|   |       `-- formats.py
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
|-- manage.py
|-- requirments.txt
`-- some_app
    |-- __init__.py
    |-- admin.py
    `-- models.py

Puede definirlo para varios idiomas simplemente proporcionando un directorio con el nombre apropiado y formats.py dentro. El contenido de ejemplo de formats.py donde toda la MAGIA sucede puede verse de la siguiente manera:

# HERE FORMATING AS shown in:
# LIST: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date
DATE_FORMAT = 'd-m-Y'
TIME_FORMAT = 'H:i'
DATETIME_FORMAT = 'd-m-Y H:i'
YEAR_MONTH_FORMAT = 'F Y'
MONTH_DAY_FORMAT = 'F j'
SHORT_DATE_FORMAT = 'm/d/Y'
SHORT_DATETIME_FORMAT = 'm/d/Y P'
FIRST_DAY_OF_WEEK = 1

# BUT here use the Python strftime format syntax,
# LIST: http://docs.python.org/library/datetime.html#strftime-strptime-behavior

DATE_INPUT_FORMATS = (
    '%d-%m-%Y',     # '21-03-2014'
)
TIME_INPUT_FORMATS = (
    '%H:%M:%S',     # '17:59:59'
    '%H:%M',        # '17:59'
)
DATETIME_INPUT_FORMATS = (
    '%d-%m-%Y %H:%M',     # '21-03-2014 17:59'
)

DECIMAL_SEPARATOR = u'.'
THOUSAND_SEPARATOR = u','
NUMBER_GROUPING = 3

Tenga en cuenta dos enlaces en los comentarios, que lo guiarán a listas de configuraciones adecuadas, ¡LAS CUALES SON DIFERENTES para las diferentes partes!

En tus settings.py solo agrega:

FORMAT_MODULE_PATH = 'demo_time_set.formats'

[GITHUB] Aquí hay un ejemplo completo de trabajo: https://github.com/andilab/demo_time_set


7
2018-03-21 17:13



Preguntas populares