Note that there are some explanatory texts on larger screens.

plurals
  1. POStrange Django-admin behaviour
    primarykey
    data
    text
    <p>I met very strange django admin site behaviour.<br> here is my <code>admin.py</code>: </p> <pre><code>from django.contrib import admin from pastebin.models import Paste from datetime import date class ExpiredListFilter(admin.SimpleListFilter): title = u"Expiration" parameter_name = "expiration_date" def lookups(self, request, model_admin): return ( ('yes', u'expired'), ('no', u'actual'), ) def queryset(self, request, queryset): if self.value == 'yes': return queryset.filter(expiration_date__lt=date.today()) if self.value == 'no': return queryset.filter(expiration_date__gte=date.today()) class AuthExpiredListFilter(ExpiredListFilter): def lookups(self, request, model_admin): if request.user.is_superuser: return super(AuthExpiredListFilter, self).lookups(request, model_admin) def queryset(self, request, queryset): if request.user.is_superuser: return super(AuthExpiredListFilter, self).queryset(request, queryset) class PasteAdmin(admin.ModelAdmin): date_hierarchy = "created_at" fields = ('author', 'title', 'content', 'syntax', 'expiration_date') list_display = ('title', 'author', 'syntax', 'is_expired') list_display_links = ('title',) list_filter = (AuthExpiredListFilter,) admin.site.register(Paste, PasteAdmin) </code></pre> <p>I'm just trying to create my own Filter. Application is about creating pastes... similar to pastebin. so every paste has it's expiration date. But admin site doesn't show me expired pastes. I can see it in the shell by calling <code>objects.all()</code> or by direct lookup <code>objects.get(pk=)</code>.<br> Here is my <code>model.py</code>: </p> <pre><code>from django.db import models from django.contrib.auth.models import User from datetime import date, datetime, timedelta class ExpQuerySet(models.query.QuerySet): ''' QuerySet for administrative purpose only. Gives access to expired Pastes to archive and delete them ''' def actual(self): return self.filter(expiration_date__gte=date.today()) def expired(self): return self.filter(expiration_date__lt=date.today()) class ActualExpiredManager(models.Manager): ''' Class to manage ExpQuerySet. Gives access to it's actual() and expired() methods. ''' def get_query_set(self): return ExpQuerySet(self.model) def __getattr__(self, attr, *args): if attr.startswith("_") or attr.startswith("__"): raise AttributeError return getattr(self.get_query_set(), attr, *args) class ActualManager(models.Manager): ''' Actual manager to work with. Returns a QuerySet of actual Pastes. ''' def get_query_set(self): return ExpQuerySet(self.model).actual() def __getattr__(self, attr, *args): if attr.startswith("_") or attr.startswith("__"): raise AttributeError return getattr(self.get_query_set(), attr, *args) class Paste(models.Model): SYNTAX_CHOICES = ( ('txt', u'Text'), ('py', u'Python'), ('js', u'JavaScript'), ('rb', u'Ruby'), ('pl', u'Perl'), ('asp', u'ASP.NET'), ('java', u'Java'), ) title = models.CharField(max_length=100, blank=True, verbose_name=u"Paste's Title") author = models.ForeignKey(User, null=True, verbose_name=u"Paste's Author") content = models.TextField() syntax = models.CharField(max_length=5, choices=SYNTAX_CHOICES, default='txt') created_at = models.DateTimeField(auto_now_add=True, verbose_name=u"Was created at") modified_at = models.DateTimeField(auto_now=True, verbose_name=u"Was modified at") expiration_date = models.DateField(verbose_name=u"Date to expire") _objects = ActualManager() # it was objects.. I thought this is a cause of a problem so I've added underscore and simple Manager act_exp = ActualExpiredManager() objects = models.Manager() def __unicode__(self): return self.title def save(self, *args, **kwargs): if len(self.title) == 0: self.title = u"Untitled Post" super(Paste, self).save(*args, **kwargs) class Meta: ordering=['-created_at'] def was_modified(self): r_range = self.created_at + timedelta(minutes=2) if self.modified_at &lt; r_range: return False return True was_modified.short_description = "Was modified" was_modified.boolean = True def is_expired(self): if self.expiration_date &lt; date.today(): return True return False is_expired.short_description = "Is expired" is_expired.boolean = True </code></pre> <p>Where did I make a mistake?<br> <img src="https://i.stack.imgur.com/Bqg9D.png" alt="django error screenshot"> it cannot get paste with id=6<br> <img src="https://i.stack.imgur.com/oShCR.png" alt="console screenshot"> everything is ok<br> Thanx in advance. Maybe someone will show my mistake.</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload