Should have done this a long time ago
Dec 12, 2008

Really, this was a pretty major oversight on my part, but I just now finished added a 'status' field to each entry in my blog app. It's a pretty simple thing in and of itself, I just added a tiny bit of code to my Entry model: STATUS_CHOICES = ( ('dr', 'draft'), ('ac', 'active'), ('ar', 'archive'), ) status = models.CharField(choices=STATUS_CHOICES, max_length=2, default='dr') And then a custom manager as well: class EntryManager(models.Manager): def active(self): return self.get_query_set().filter(status='ac') Remembering, of course, to make sure that manager was actually accessible from the model (in this case by adding 'objects = EntryManager()' to my model class). Once I did that I was able to change the Entry.objects.all() in my view(s) to Entry.objects.active() and now I'm able to write a post and save it without actually publishing! As I said, something of a bonehead move that I didn't do this in the first place. Since I was messing around in my code anyway I decided to clean up the admin for my Entry model as well. Since I'm the only one who ever uses the admin for my blog, I hadn't bothered to before, but now I've got a little more info available to me when looking at my entries: class EntryAdmin(admin.ModelAdmin): prepopulated_fields = {'slug': ('title',)} save_on_top = True list_display = ['title', 'date', 'site_list', 'status',] list_filter = ('sites', 'status',) So my admin now looks something like this: A cool thing there is the 'site_list' column. By default, you can't use a ManyToManyField in the list_display for your model. But I've dealt with this before, and it's only 5 lines of code to make this work: def site_list(self): if self.sites: sites = [site.name for site in self.sites.all()] string = ", ".join(sites) return string Good stuff!
blog comments powered by Disqus