python - theme - django-admin command
DateTimeField no se muestra en el sistema de administración (7)
¿Por qué mi campo de "fecha" no aparece en el sistema de administración?
En mi archivo admin.py tengo
from django.contrib import admin
from glasses.players.models import *
admin.site.register(Rating)
y el modelo de Calificación tiene un campo llamado "fecha" que se ve así
date = models.DateTimeField(editable=True, auto_now_add=True)
Sin embargo, dentro del sistema de administración, el campo no se muestra, aunque editable
está configurado como True
.
¿Alguien tiene alguna idea?
Creo que la razón radica en el campo auto_now_add
.
De esta respuesta :
Cualquier campo con el conjunto de atributos auto_now también heredará editable = False y, por lo tanto, no se mostrará en el panel de administración.
También mencionado en los documentos :
Según lo implementado actualmente, establecer auto_now o auto_now_add en True hará que el campo tenga editable = False y blank = True set.
Esto tiene sentido, ya que no hay razón para que el campo sea editable si se va a sobrescribir con la fecha actual cuando se guarda el objeto.
Dependiendo de sus necesidades específicas y cualquier matiz en la diferencia de comportamiento, puede hacer lo siguiente:
from django.utils.timezone import now
class MyModel(models.Model):
date = models.DateTimeField(default=now)
El campo predeterminado se puede usar de esta manera: https://docs.djangoproject.com/en/dev/ref/models/fields/#default
The default value for the field. This can be a value or a callable object. If callable it will be called every time a new object is created.
Esto no establece editable en False
No puedes hacer eso, verifica la documentation
auto_now y auto_now_add son campos no editables y no puede anularlos ...
Puede que tenga que ver con que auto_now_add sea verdadero. Tal vez en lugar de ese parámetro para capturar la fecha en la adición, podría anular el método de guardado del modelo para insertar la fecha y hora cuando el ID sea nulo.
class Rating(models.Model):
....
def save(self, *args, **kwargs)
if not self.id:
self.date = datetime.datetime.now()
Si desea que algún campo sea visible en la lista de todas sus entradas (cuando hace clic en un modelo en la gente de administración) y no cuando abre esa entrada en particular, entonces -
class RatingAdmin(admin.ModelAdmin):
list_display = (''name'', ''date'')
admin.site.register(Rating, RatingAdmin)
''nombre'' es su campo principal o cualquier otro campo que desee mostrar en el panel de administración.
De esta manera puedes especificar todas las columnas que quieres ver.
Si realmente desea ver la fecha en el panel de administración, puede agregar readonly_fields
en admin.py :
class RatingAdmin(admin.ModelAdmin):
readonly_fields = (''date'',)
admin.site.register(Rating,RatingAdmin)
Cualquier campo que especifique se agregará por último después de los campos editables. Para controlar el orden puedes usar las opciones de los fields
.
Información adicional está disponible en los documentos de Django .
Mayor Hack:
Si realmente necesita hacer esto (como lo hago yo), siempre puede hackearlo configurando el campo para que sea "editable" definiendo el campo de la siguiente manera:
class Point(models.Model):
mystamp=models.DateTimeField("When Created",auto_now_add=True)
mystamp.editable=True
Esto hará que el campo sea editable, por lo que realmente puede alterarlo. Parece funcionar bien, al menos con el motor de respaldo mysql. No puedo decir por certian si otras tiendas de respaldo harían que estos datos fueran inmutables en la base de datos y, por lo tanto, causen un problema cuando se intente editar, así que use con precaución .