2017-05-19 4 views
1

J'ai une classe Day dont l'ID est un champ DateField. J'ai une classe d'événement qui relie via ForeignKey à ce DateField. Je voudrais utiliser des fonctionnalités telles que ModelAdmin date_hierarchy mais je reçoisComment faire pour que Django ForeignKey se comporte comme un champ DateField

<class 'myapp.admin.EventAdmin'>: (admin.E128) 
The value of 'date_hierarchy' must be a DateField or DateTimeField. 

Ceci est mon fichier models.py:

class Day(models.Model): 
    date = models.DateField(primary_key=True) 

    def __str__(self): 
     return str(self.date) 

class Event(models.Model): 
    date = models.ForeignKey(Day, to_field='date', related_name='events') 
    bullet = models.TextField() 

    def __str__(self): 
     return self.bullet[:20] 

Et admin.py a:

class EventAdmin(admin.ModelAdmin): 
    list_display = ('date', 'bullet') 
    search_fields = ('bullet',) 
    list_filter = ('date',) 
    date_hierarchy = 'date' 
    ordering = ('-date',) 

date_hierarchy doesn ne fonctionne pas, et list_filter ne casse pas les choses par date.

Existe-t-il un moyen de convertir le champ Event ForeignKey en un formulaire vu comme un champ DateField?

J'ai regardé here et here échoué, bien qu'une fonctionnalité venant dans v1.11 puisse me permettre de référencer directement des champs sur des modèles liés.

Répondre

0

J'espère que ceci est un exemple inventé parce que les tables de colonne simples n'ont pas beaucoup de sens ici. Vous pouvez tout aussi facilement avoir ce

class Event(models.Model): 
    date = models.DateField(primary_key=True) 
    bullet = models.TextField() 

En supposant que vous avez laissé quelques champs relevent et le modèle de jour est important, l'événement devrait être juste:

class Event(models.Model): 
    date = models.ForeignKey(Day, related_name='events') 
    bullet = models.TextField() 

Le to_field est pas vraiment utile ici . puis

class EventAdmin(admin.ModelAdmin): 
    list_display = ('date__date', 'bullet') 
    search_fields = ('bullet',) 
    list_filter = ('date__date',) 
    date_hierarchy = 'date__date' 
    ordering = ('-date__date',) 
+0

Étrangement, en utilisant le double underscore « date__date » référence list_filter fixe (il offre maintenant la norme « par date » boîte) - mais il n'a toujours pas fixé date_hierarchy - Django m'a donné ': (admin.E127) La valeur de' date_hierarchy 'fait référence à' date __date ', qui n'est pas un attribut de' myapp.Event'.' Weird. Je cours Django 1.10.5 dans ce virtualenv particulier. – Sharpasamarble

+0

qu'est-ce qui est étrange à propos de ça? c'est la notation django standard pour se référer aux modèles associés. Mais la notation standard n'utilise pas d'espaces au milieu comme vous l'avez fait 'date __date' – e4c5

+0

Il s'est avéré être un problème de Django v1.10. J'ai essayé 'date__date' dans un virtualenv v1.11, et cela a fonctionné. v1.11 prend en charge date_hierarchy dans les relations, comme cela a été répondu [ici] (http://stackoverflow.com/questions/19102169/set-admin-date-hierarchy-to-a-forekeykey-date-field) – Sharpasamarble