Added blog app:
+ BlogEntry model + Views for news lists and news detail + Migrations + Custom date time filter based on settings timezone
This commit is contained in:
parent
513946e6fe
commit
ffea80c049
|
@ -0,0 +1,38 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
# Adding model 'BlogEntry'
|
||||
db.create_table(u'blog_blogentry', (
|
||||
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('title', self.gf('django.db.models.fields.CharField')(max_length=128)),
|
||||
('date', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2013, 5, 28, 0, 0))),
|
||||
('content', self.gf('django.db.models.fields.TextField')()),
|
||||
('slug', self.gf('django.db.models.fields.SlugField')(max_length=128)),
|
||||
))
|
||||
db.send_create_signal('blog', ['BlogEntry'])
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
# Deleting model 'BlogEntry'
|
||||
db.delete_table(u'blog_blogentry')
|
||||
|
||||
|
||||
models = {
|
||||
'blog.blogentry': {
|
||||
'Meta': {'ordering': "['date']", 'object_name': 'BlogEntry'},
|
||||
'content': ('django.db.models.fields.TextField', [], {}),
|
||||
'date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2013, 5, 28, 0, 0)'}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '128'}),
|
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '128'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['blog']
|
|
@ -0,0 +1,34 @@
|
|||
from django.db import models
|
||||
from django.contrib import admin
|
||||
import datetime
|
||||
from django.utils.timezone import utc
|
||||
|
||||
|
||||
# Create your models here.
|
||||
class BlogEntry(models.Model):
|
||||
title = models.CharField(max_length=128)
|
||||
date = models.DateTimeField(auto_now_add=True)
|
||||
content = models.TextField()
|
||||
slug = models.SlugField(max_length=128)
|
||||
|
||||
class Meta:
|
||||
app_label = 'blog'
|
||||
ordering = ['-date']
|
||||
|
||||
|
||||
class BlogEntryAdmin(admin.ModelAdmin):
|
||||
list_display = ('title', 'date', )
|
||||
list_display_links = ('title', )
|
||||
|
||||
list_filter = ('date', )
|
||||
search_fields = ('title', 'content', )
|
||||
|
||||
prepopulated_fields = {"slug": ("title",)}
|
||||
|
||||
class Media:
|
||||
css = {
|
||||
"all": ("lib/redactor.css",)
|
||||
}
|
||||
js = ("lib/redactor.js",)
|
||||
|
||||
admin.site.register(BlogEntry, BlogEntryAdmin)
|
|
@ -0,0 +1,24 @@
|
|||
{% extends "layout.html" %}
|
||||
|
||||
{% block content %}
|
||||
<h1>Blog</h1>
|
||||
{% for item in page.object_list %}
|
||||
<hr />
|
||||
<article>
|
||||
<h2><a href="/blog/{{ item.date.year }}/{{ item.date.month }}/{{ item.date.day }}/{{ item.slug }}">{{ item.title }}</a></h2>
|
||||
<div><i class="icon-calendar"></i> {{ item.date|dt('%B %e, %Y') }}</div>
|
||||
<p>{{ item.content|nl2br }}</p>
|
||||
</article>
|
||||
{% endfor %}
|
||||
{% if paginator.num_pages > 1 %}
|
||||
<div class="pagination pagination-centered">
|
||||
<ul>
|
||||
{% for p in range(1, paginator.num_pages+1) %}
|
||||
<li {% if p == page_number %}class="active"{% endif %}>
|
||||
<a href="{{ url('blocks_list') }}?page={{ p }}">{{ p }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
|
@ -0,0 +1,8 @@
|
|||
{% extends "layout.html" %}
|
||||
|
||||
{% block content %}
|
||||
<p><a href="{{ url('blog_list') }}"><i class="icon-arrow-left"></i> Go back</a></p>
|
||||
<h1>{{ item.title }}</h1>
|
||||
<div><i class="icon-calendar"></i> {{ item.date|dt('%B %e, %Y') }}</div>
|
||||
<p>{{ item.content|nl2br }}</p>
|
||||
{% endblock %}
|
|
@ -0,0 +1,16 @@
|
|||
"""
|
||||
This file demonstrates writing tests using the unittest module. These will pass
|
||||
when you run "manage.py test".
|
||||
|
||||
Replace this with more appropriate tests for your application.
|
||||
"""
|
||||
|
||||
from django.test import TestCase
|
||||
|
||||
|
||||
class SimpleTest(TestCase):
|
||||
def test_basic_addition(self):
|
||||
"""
|
||||
Tests that 1 + 1 always equals 2.
|
||||
"""
|
||||
self.assertEqual(1 + 1, 2)
|
|
@ -0,0 +1,42 @@
|
|||
from blog.models import BlogEntry
|
||||
from django.core.paginator import Paginator
|
||||
from django.shortcuts import render_to_response
|
||||
from django.template import RequestContext
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
def blog(request):
|
||||
section = 'blog'
|
||||
|
||||
items = BlogEntry.objects.all()
|
||||
paginator = Paginator(items, 4)
|
||||
page_number = 1
|
||||
|
||||
if 'page' in request.GET:
|
||||
page_number = int(request.GET['page'])
|
||||
|
||||
page = paginator.page(page_number)
|
||||
|
||||
data = {
|
||||
'section': section,
|
||||
'page': page,
|
||||
'page_number': page_number,
|
||||
'paginator': paginator,
|
||||
}
|
||||
context = RequestContext(request, data)
|
||||
return render_to_response('blog.html', context_instance=context)
|
||||
|
||||
|
||||
def blog_item(request, year, month, day, slug):
|
||||
item = BlogEntry.objects.get(
|
||||
slug=slug,
|
||||
date__year=int(year),
|
||||
date__month=int(month),
|
||||
date__day=int(day)
|
||||
)
|
||||
|
||||
data = {
|
||||
'item': item
|
||||
}
|
||||
context = RequestContext(request, data)
|
||||
return render_to_response('blog_entry.html', context_instance=context)
|
|
@ -0,0 +1,15 @@
|
|||
from jingo import register
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.utils.encoding import smart_unicode
|
||||
from django.conf import settings
|
||||
from pytz import timezone
|
||||
import pytz
|
||||
|
||||
|
||||
@register.filter
|
||||
def dt(t, fmt=None):
|
||||
"""Call ``datetime.strftime`` with the given format string."""
|
||||
tz = timezone(settings.TIME_ZONE)
|
||||
if fmt is None:
|
||||
fmt = _('%B %e, %Y')
|
||||
return smart_unicode(tz.normalize(t).strftime(fmt)) if t else u''
|
|
@ -1,5 +1,6 @@
|
|||
from django.conf.urls import patterns, include, url
|
||||
from django.http import HttpResponse, HttpResponseRedirect
|
||||
from herobrine import filters
|
||||
|
||||
# Admin
|
||||
from django.contrib import admin
|
||||
|
|
Loading…
Reference in New Issue