Pourquoi mon champ "date" n'apparaît-il 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 s'il editable
est défini sur True
.
Est-ce que quelqu'un a une idée?
la source
auto_now_add
via l'administrateur après la création de l'entrée?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
fields
options.Des informations supplémentaires sont disponibles dans la documentation Django .
la source
fields
vous devez également mettre votre champ dans ce champ, donc vous en auriez besoin à la foisreadonly_fields
etfields
sinon le champ ne s'afficherait pas.fieldsets
, je viens de rencontrer ce problème aujourd'hui.auto_now_add=True
sous Django 1.9. Une (sorte de) solution de contournement consiste à les ajouter aulist_display
tuple à la place. Edit: Cela fonctionnera si vous ajoutez également votre champfields
comme @BjornTipling mentionné.Piratage majeur:
Si vous avez vraiment besoin de faire cela (comme je le fais), vous pouvez toujours le contourner en définissant immédiatement le champ pour être "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 pouvez donc le modifier. Cela semble fonctionner correctement, du moins avec le moteur de sauvegarde mysql. Je ne peux pas dire pour certian si d'autres magasins de support rendraient ces données immuables dans la base de données et causeraient ainsi un problème lors d'une tentative d'édition, alors utilisez-les avec prudence .
la source
En fonction de vos besoins spécifiques et des nuances de différence de comportement, vous pouvez procéder comme suit:
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
la source
from django.utils.timezone import now
place dedatetime.now
, mais cela semble prometteur.Cela pourrait avoir à voir avec le fait que auto_now_add est vrai. Peut-être qu'au lieu de ce paramètre pour capturer la date lors de l'ajout, vous pouvez remplacer la méthode de sauvegarde du modèle pour insérer la date-heure lorsque l'id est nul.
class Rating(models.Model): .... def save(self, *args, **kwargs) if not self.id: self.date = datetime.datetime.now()
la source
auto_now
n'est pas utilisée eteditable=False
. +1Si vous souhaitez 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.
la source
Vous ne pouvez pas faire ça, consultez la documentation
auto_now et auto_now_add sont tous des champs non modifiables et vous ne pouvez pas les remplacer ...
la source