Reputation: 1948
I've been pulling my hair out on this one and it seems like there is a really simple solution for it but I'm too blind to see it. I've upgraded from Django 1.4.3 to Django 1.6 and ever since then I get an assertion error while trying to get DateTimeField to work.
Here's my model
class Article(models.Model):
'''Article Model'''
banner = models.ImageField(verbose_name="Banner", null=True, blank=True, upload_to='ajax_uploads/banners', max_length=300)
title = models.CharField(
verbose_name = _(u'Title'),
help_text = _(u' '),
max_length = 255
)
slug = models.SlugField(
verbose_name = _(u'Slug'),
help_text = _(u'Uri identifier.'),
max_length = 255
)
content_markdown = models.TextField(
verbose_name = _(u'Content (Markup)'),
help_text = _(u' '),
)
content_markup = models.TextField(
verbose_name = _(u'Content (Markup)'),
help_text = _(u' '),
)
categories = models.ManyToManyField(
Category,
verbose_name = _(u'Categories'),
help_text = _(u' '),
null = True,
blank = True
)
date_publish = models.DateTimeField(
default=datetime.date.today,
verbose_name = _(u'Publish Date'),
help_text = _(u' ')
)
class Meta:
app_label = _(u'blog')
verbose_name = _(u'Article')
verbose_name_plural = (u'Articles')
ordering = ['-date_publish']
def save(self):
self.content_markup = markdown(self.content_markdown, ['codehilite'])
super(Article, self).save()
def __unicode__(self):
return '%s' % (self.title,)
views.py:
def index(request):
'''News index'''
archive_dates = Article.objects.dates('date_publish','month', order='DESC')
categories = Category.objects.all()
page = request.GET.get('page')
article_queryset = Article.objects.all()
paginator = Paginator(article_queryset, 5)
try:
articles = paginator.page(page)
except PageNotAnInteger:
#If page requested is not an integer, deliver first page.
articles = paginator.page(1)
except EmptyPage:
#If page requested is out of range, deliver last page of results.
articles = paginator.page(paginator.num_pages)
return render(
request,
'blog/article/index.html',
{
'articles' : articles,
'archive_dates' : archive_dates,
'categories' : categories
}
)
and template
<div class="8u skel-cell-important">
{% for item in articles %}
<!-- Content -->
<article class="box is-post">
<a href="{% url "blog-article-single" slug=item.slug %}" class="image image-full"><img src="/media/{{ item.banner }}" alt="" /></a>
<header>
<h2><a href="{% url "blog-article-single" slug=item.slug %}">{{ item.title }}</a></h2>
<span class="byline">Published {{ item.date_publish|date:"j, M, Y" }}</span>
</header>
<p>
{{ item.content_markup|safe|slice:":250" }}...
</p>
</article>
{% endfor %}
</div>
and finally error traceback:
AssertionError at /blog/
'date_publish' is a DateTimeField, not a DateField.
Request Method: GET
Request URL: http://localhost:8000/blog/
Django Version: 1.6.1
Exception Type: AssertionError
Exception Value:
'date_publish' is a DateTimeField, not a DateField.
Exception Location: /usr/local/lib/python2.7/dist-packages/django/db/models/sql/subqueries.py in _check_field, line 258
Python Executable: /usr/bin/python2.7
Python Version: 2.7.3
Python Path:
['/home/user/paperpxl',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-linux2',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/PIL',
'/usr/lib/python2.7/dist-packages/gst-0.10',
'/usr/lib/python2.7/dist-packages/gtk-2.0',
'/usr/lib/pymodules/python2.7',
'/usr/lib/python2.7/dist-packages/ubuntu-sso-client',
'/usr/lib/python2.7/dist-packages/ubuntuone-client',
'/usr/lib/python2.7/dist-packages/ubuntuone-control-panel',
'/usr/lib/python2.7/dist-packages/ubuntuone-couch',
'/usr/lib/python2.7/dist-packages/ubuntuone-installer',
'/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']
Server time: Thu, 19 Dec 2013 15:28:43 +0000
Any kind of help would be appreciated!
EDIT : Thanks for your help guys, I'm going back to the release notes to read through them again! I wish I had an eye for detail like you do.
Upvotes: 4
Views: 12591
Reputation: 8061
From the Django 1.6 release notes:
QuerySet.dates() no longer usable on DateTimeField
QuerySet.dates() raises an error if it’s used on DateTimeField when time zone support is active. Use QuerySet.datetimes() instead.
You use dates
on the view, with the date_publish
DateTimeField model.
Upvotes: 1
Reputation: 308849
date_publish
is a DateTimeField
, not a DateField
. Use the datetimes()
method instead of dates()
.
Article.objects.datetimes('date_publish', 'month', order='DESC')
See the 1.6 release notes for more details.
Upvotes: 10