web-dev-qa-db-fra.com

DateTimeField ne s'affiche pas dans le système d'administration

Comment se fait-il que mon champ "date" ne s'affiche pas dans le système d'administration?

Dans mon fichier admin.py j'ai

from Django.contrib import admin
from glasses.players.models import *
admin.site.register(Rating)

et le modèle de notation a un champ appelé "date" qui ressemble à ceci

date = models.DateTimeField(editable=True, auto_now_add=True)

Cependant, dans le système d'administration, le champ ne s'affiche pas, même si editable est défini sur True.

Est-ce que quelqu'un a une idée?

73
dotty

Je crois que la raison réside dans le auto_now_add champ.

De cette réponse :

Tout champ avec l'attribut auto_now héritera également editable = False et n'apparaîtra donc pas dans le panneau d'administration.

Également mentionné dans la documentation :

Telle qu'elle est actuellement implémentée, la définition de auto_now ou auto_now_add sur True entraînera la modification du champ = False et vide = True pour le champ.

Cela a du sens, car il n'y a aucune raison de modifier le champ s'il doit être remplacé par la date/heure actuelle lorsque l'objet est enregistré.

45
Shawn Chin

Si vous voulez vraiment voir la date dans le panneau d'administration, vous pouvez ajouter readonly_fields dans admin.py :

class RatingAdmin(admin.ModelAdmin):
    readonly_fields = ('date',)

admin.site.register(Rating,RatingAdmin)

Tout champ que vous spécifiez sera ajouté en dernier après les champs modifiables. Pour contrôler l'ordre, vous pouvez utiliser les options fields.

Des informations supplémentaires sont disponibles dans les Django docs .

175
Hunger

Hack majeur:

Si vous avez vraiment besoin de faire cela (comme moi), vous pouvez toujours le contourner en définissant immédiatement le champ comme "modifiable" en définissant le champ comme suit:

class Point(models.Model):
  mystamp=models.DateTimeField("When Created",auto_now_add=True)
  mystamp.editable=True

Cela rendra le champ modifiable, vous pourrez donc le modifier. Cela semble bien fonctionner, au moins avec le moteur de support mysql. Je ne peux pas dire au certian si d'autres magasins de sauvegarde rendraient ces données immuables dans la base de données et causeraient donc un problème lors de la tentative de modification, tilisez donc avec prudence.

21
Brad

Selon vos besoins spécifiques et toute nuance de différence de comportement, vous pouvez effectuer les opérations suivantes:

from Django.utils.timezone import now

class MyModel(models.Model):
    date = models.DateTimeField(default=now)

Le champ par défaut peut être utilisé de cette façon: 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.

Cela ne définit pas modifiable sur False

7
orblivion

Cela peut être dû au fait que auto_now_add est vrai. Au lieu de ce paramètre pour capturer la date lors de l'ajout, vous pouvez peut-être remplacer la méthode de sauvegarde du modèle pour insérer le datetime lorsque l'ID est nul.

class Rating(models.Model):

    ....
    def save(self, *args, **kwargs)
        if not self.id: 
            self.date = datetime.datetime.now()
5
Joe J

Si vous voulez qu'un champ soit visible dans la liste de toutes vos entrées (lorsque vous cliquez sur un modèle dans les administrateurs) et non lorsque vous ouvrez cette entrée particulière, alors -

class RatingAdmin(admin.ModelAdmin):
    list_display = ('name', 'date') 

admin.site.register(Rating, RatingAdmin)

'nom' étant votre champ principal ou tout autre champ que vous souhaitez afficher dans le panneau d'administration.

De cette façon, vous pouvez spécifier toutes les colonnes que vous souhaitez voir.

3
Jyotman Singh

Vous ne pouvez pas faire ça, vérifiez la documentation

auto_now et auto_now_add sont tous champs non modifiables et vous ne pouvez pas les remplacer ...

0
FallenAngel