среда, 27 марта 2013 г.

Django Paginator

views.py

from django.shortcuts import render_to_response
from django.template import RequestContext
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

from blog.data.models import Entry

def index(request):
    entries = Entry.objects.published_entries().order_by('-id')
    paginator = Paginator(entries, 2)
    page_num = request.GET.get('page', 1)
    try:
        page = paginator.page(page_num)
    except EmptyPage:
        page = paginator.page(paginator.num_pages)
    except PageNotAnInteger:
        page = paginator.page(1)

    return render_to_response('homepage/index.html', {'page': page}, context_instance = RequestContext(request))

--------------------------------------------------------------------------------------------

index.html

{% extends "homepage/base.html" %}

{% block content %}
    <h3>Entries</h3>
    {% for entry in page.object_list %}
    <div>{{ entry.title }} - {{ entry.created }}</div>
    <div>{{ entry.text }}</div>
    <br />
    {% endfor %}
   
    {% if page.has_previous %}
    <a href="?page={{ page.previous_page_number }}">prev</a>
    {% endif %}
   
    | {{ page.number }} |
   
    {% if page.has_next %}
    <a href="?page={{ page.next_page_number }}">next</a>
    {% endif %}

   
{% endblock %}

вторник, 26 марта 2013 г.

Django MEDIA_URL in Templates

settings.py

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = os.path.normpath(os.path.join(os.path.dirname(__file__), 'static/'))

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = '/static/'

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = ''

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'

# URL prefix for admin static files -- CSS, JavaScript and images.
# Make sure to use a trailing slash.
# Examples: "http://foo.com/static/admin/", "/static/admin/".
ADMIN_MEDIA_PREFIX = '/static/admin/'

TEMPLATE_CONTEXT_PROCESSOR = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.media',
)

--------------------------------------------------------------------------------------------

views.py

from django.shortcuts import render_to_response
from blog.data.models import Entry
from django.template import RequestContext

def index(request):
    entries = Entry.objects.published_entries().order_by('-id')
    return render_to_response('homepage/index.html', {'entries': entries}, context_instance = RequestContext(request))

def about(request):
    return render_to_response('homepage/about.html', context_instance = RequestContext(request))

def contact(request):
    return render_to_response('homepage/contact.html', context_instance = RequestContext(request))

def archive(request):
    return render_to_response('homepage/archive.html', context_instance = RequestContext(request))

--------------------------------------------------------------------------------------------

base.html

<html>
<head>
    <title>{% block title %}{% endblock %}</title>
    {% block js %}{% endblock %}
    {% block css %}<link rel="stylesheet" href="{{ MEDIA_URL }}css/main.css" type="text/css" media="screen" />{% endblock %}
</head>
<body>
    <div id="top">My Blog</div>
    <div id="navi">{% block navi %}{% endblock %}</div>
    <div id="content">{% block content %}{% endblock %}</div>
    <div id="footer">{% block footer %}{% endblock %}</div>
</body>
</html>

Django Static files on Developer Server

base.html

<html>
<head>
    <title>{% block title %}{% endblock %}</title>
    {% block js %}{% endblock %}
    {% block css %}<link rel="stylesheet" href="/static/css/main.css" type="text/css" media="screen" />{% endblock %}
</head>
<body>
    <div id="top">My Blog</div>
    <div id="navi">{% block navi %}{% endblock %}</div>
    <div id="content">{% block content %}{% endblock %}</div>
    <div id="footer">{% block footer %}{% endblock %}</div>
</body>
</html>

--------------------------------------------------------------------------------------------

settings.py

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = os.path.normpath(os.path.join(os.path.dirname(__file__), 'static/'))

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = '/static/'

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = ''

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'

# URL prefix for admin static files -- CSS, JavaScript and images.
# Make sure to use a trailing slash.
# Examples: "http://foo.com/static/admin/", "/static/admin/".
ADMIN_MEDIA_PREFIX = '/static/admin/'

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.admin',
    'blog.data',
)

-------------------------------------------------------------------------------------------- 

urls.py

from django.conf.urls.defaults import patterns, include, url

from blog import settings

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^$', 'blog.homepage.views.index', name = 'homepage_index'),
    url(r'^about/$', 'blog.homepage.views.about', name = 'homepage_about'),
    url(r'^contact/$', 'blog.homepage.views.contact', name = 'homepage_contact'),
    url(r'^archive/$', 'blog.homepage.views.archive', name = 'homepage_archive'),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
)

Django Urls from urls.py in Templates

urls.py

from django.conf.urls.defaults import patterns, include, url

from blog import settings

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^$', 'blog.homepage.views.index', name = 'homepage_index'),
    url(r'^about/$', 'blog.homepage.views.about', name = 'homepage_about'),
    url(r'^contact/$', 'blog.homepage.views.contact', name = 'homepage_contact'),
    url(r'^archive/$', 'blog.homepage.views.archive', name = 'homepage_archive'),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
)

--------------------------------------------------------------------------------------------

index.html

{% extends "homepage/base.html" %}

{% block title %}My Blog Index{% endblock %}

{% block navi %}
<a href="{% url homepage_index %}">home</a> - <a href="{% url homepage_about %}">about</a> - <a href="{% url homepage_archive %}">archive</a> - <a href="{% url homepage_contact %}">contact</a>
{% endblock %}

{% block content %}
    <h3>Entries</h3>
    {% for entry in entries %}
    <div>{{ entry.title }} - {{ entry.created }}</div>
    <div>{{ entry.text }}</div>
    <br />
    {% endfor %}
{% endblock %}

{% block footer %}
2011 - MyBlog
{% endblock %}

Django Model Managers

data/managers.py

from django.db import models

class EntryManager(models.Manager):
    def published_entries(self):
        return self.model.objects.filter(published = True)

--------------------------------------------------------------------------------------------

data/models.py

#-*- coding: utf-8 -*-

from django.db import models
from blog.data.managers import EntryManager

class Entry(models.Model):
    created = models.DateTimeField(auto_now_add = True)
    updated = models.DateTimeField(auto_now = True)
    title   = models.CharField(max_length = 64)
    text    = models.TextField()
    published = models.BooleanField(db_index = True, default = True)
   
    objects = EntryManager()
   
    def __unicode__(self):
        return u'%s - %s' % (self.title, self.created)

--------------------------------------------------------------------------------------------

data/views.py

from django.shortcuts import render_to_response
from blog.data.models import Entry

def index(request):
    entries = Entry.objects.published_entries().order_by('-id')
    return render_to_response('homepage/index.html', {'entries': entries})

Comparison of Common Windows and Linux Commands

Command's PurposeMS-DOSLinuxBasic Linux Example
Copies filescopycpcp thisfile.txt /home/thisdirectory
Moves filesmovemvmv thisfile.txt /home/thisdirectory
Lists filesdirlsls
Clears screenclsclearclear
Closes prompt windowexitexitexit
Displays or sets datedatedatedate
Deletes filesdelrmrm thisfile.txt
"Echoes" output on the screenechoechoecho this message
Edits files with simple text editoreditpico[a]pico thisfile.txt
Compares the contents of filesfcdiffdiff file1 file2
Finds a string of text in a filefindgrepgrep this word or phrase thisfile.txt
Formats a disketteformat a: (if diskette is in A:)mke2fs (or mformat[b])/sbin/mke2fs /dev/fd0 (/dev/fd0 is the Linux equivalent of A:)
Displays command helpcommand /?man[c]man command
Creates a directorymkdirmkdirmkdir directory
View a filemoreless[d]less thisfile.txt
Renames a filerenmvmv thisfile.txt thatfile.txt[e]
Displays your location in the file systemchdirpwdpwd
Changes directories with a specified path (absolute path)cd pathnamecd pathnamecd /directory/directory
Changes directories with a relative pathcd ..cd ..cd ..
Displays the timetimedatedate
Shows amount of RAM and usememfreefree
Notes:
a. Pico is a simple text editor; other editors you can use in place of Pico include Emacs and vi.
b. This formats a disk for the DOS filesystem.
c. You can also use info for some commands.
d. The more pager can also be used to page through a file a screen at a time.
e. The mv command can both move a file and, if you want to rename a file in the same directory, you "move" that file to the same directory with a new name, as in this example.

вторник, 19 марта 2013 г.

Python Проверка существования файла

Данный Python код проверяет существование файла и возможность работы с ним.

from os import path, access, R_OK  # W_OK for write permission.

PATH='./file.txt'

if path.exists(PATH) and path.isfile(PATH) and access(PATH, R_OK):
    print "File exists and is readable"
else:
    print "Either file is missing or is not readable"

Django UnicodeEncodeError: 'ascii' codec can't encode character Решение проблемы

При работе с Django во время записи русского текста в кодировке UTF-8 в файл может возникнуть исключение вида

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa1'
in position 0: ordinal not in range(128)


Такое исключение в Django может возникнуть, например, при выполнении такого кода:

#-*- coding: utf-8 -*-
import os

from django.template import Template, Context, loader
from django.http import HttpResponse

def write_file(request):
    pathToFile = os.path.join(os.path.dirname(__file__), 'files/newtext.txt')
    file = open(pathToFile, 'w')
    text_for_file = u'Привет! Я новый файл!'
    file.write(text_for_file)
    file.close()
    file = open(pathToFile, 'r')
    text_from_file = file.read()
    file.close()
    t = loader.get_template('filework.html')
    c = Context({'text': text_from_file})
    renderedTemplate = t.render(c)
    return HttpResponse(renderedTemplate)

Для устранения данной проблемы можно воспользоваться функцией smart_str(), имеющейся в Django, внеся в наш пример следующие две добавки:

#-*- coding: utf-8 -*-
import os

from django.template import Template, Context, loader
from django.http import HttpResponse
from django.utils.encoding import smart_str, smart_unicode

def open_file(request):
    pathToFile = os.path.join(os.path.dirname(__file__), 'files/mytext.txt')
    file = open(pathToFile, 'r')
    text_from_file = file.read()
    file.close()
    t = loader.get_template('filework.html')
    c = Context({'text': text_from_file})
    renderedTemplate = t.render(c)
    return HttpResponse(renderedTemplate)

def write_file(request):
    pathToFile = os.path.join(os.path.dirname(__file__), 'files/newtext.txt')
    file = open(pathToFile, 'w')
    text_for_file = u'Привет! Я новый файл!'
    file.write(smart_str(text_for_file))
    file.close()
    file = open(pathToFile, 'r')
    text_from_file = file.read()
    file.close()
    t = loader.get_template('filework.html')
    c = Context({'text': text_from_file})
    renderedTemplate = t.render(c)
    return HttpResponse(renderedTemplate)

вторник, 12 марта 2013 г.

LDAP

LDAP - это прежде всего протокол, который призван централизовать, унифицировать хранение и администрирование учетных записей с их свойствами, а самое главное - это централизовать процесс авторизации пользователей в КИС (корпоративные информационные системы), которые включают в себя множество разношерстных систем. Вот и получается, что храните вы все учетные записи на LDAP-сервере, а авторизация пользователей может производиться в разных системай, например почтовых клиента, системах оперативного и финансового учета и т.д. и т.п..

четверг, 7 марта 2013 г.

Django Работа с Memcached

Добавление настроек в Django для Memcached в файл settings.py

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}


Кэширование в Memcached отдельных данных.

>>> from django.core.cache import cache

>>> cache.set('my_var', 'hello world', 30)
>>> cache.get('my_var', 'or return My_var has expired')

'hello world'

>>> cache.set('a', 1, 60)
>>> cache.set('b', 2, 60)
>>> cache.set('c', 3, 60)
>>> cache.get_many(['a', 'b', 'c'])

{'a': 1, 'b': 2, 'c': 3}

>>> cache.delete('a')

>>> cache.get_many(['a', 'b', 'c'])

{'b': 2, 'c': 3}



Кэширование в Memcached целых страниц Django.

from django.conf.urls.defaults import patterns, include, url


from django.views.decorators.cache import cache_page

from mysite.myapp.views import my_view

urlpatterns = ('',
    (r'^foo/(\d{1,2})/$', cache_page(my_view, 60 * 15)),
)



Кэширование внутри файла views.py

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def my_view(request, param):
    ...
    ...
    ...



Кэширование в Memcached всех страниц.

Для этого просто добавьте в файл settings.py строку 'django.middleware.cache.CacheMiddleware' вот так:

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.CacheMiddleware',
    'django.middleware.common.CommonMiddleware',
)

среда, 6 марта 2013 г.

Django Request

request.method
request.GET['parameter']
request.POST['parameter']
request.COOKIES['cookie_name']
request.session['session_parameter']

Django Пример использования шаблонной системы отдельно от Django

import django

from django.template import Context, loader

django.conf.settings.configure(TEMPLATE_DIRS = ('/путь/до/папки/с/вашими/шаблонами',))

# Работа в вашим шаблоном.

template = loader.get_template('my_template.html')
context = Context({'problems': info_problems or 'нет',
                               'plans': info_plans or 'нет',
                               'done': info_done or 'нет'})
html = template.render(context)

Django Создание собственных шаблонных тэгов

Пример собственного шаблонного тэга.

<p>The time is {% current_time "%Y-%m-%d %I:%M %p" %}.</p>


Пример создания и регистрации шаблонного тэга.


/templatetags/tags.py

from django import template

def do_current_time(parser, token):
    try:
        tag_name, format_string = token.split_contents()
    except ValueError:
        msg = '%r tag requires a single argument' % token..split_contents()[0]
        raise template.TemplateSyntaxError(msg)
    return CurrenTimeNode(format_string[1:-1])

# token.contents - это current_time "%Y-%m-%d %I:%M %p"
# Метод token.split_contents() отделяет current_time от "%Y-%m-%d %I:%M %p", не трогая строку в кавычках. Избегайте использование стандартного метода разбиения строк по пробелу token.contents.split(), так как такой метод не учитывает кавычки, разбивая все по пробелам.
# Таким образом после token.split_contents(): tag_name = "current_time", format_string = "%Y-%m-%d %I:%M %p".
# token.split_contents()[0] - всегда получает имя вашего тэга. В данном случае это "current_time".
# format_string[1:-1] убирает кавычки из "%Y-%m-%d %I:%M %p". Получается просто %Y-%m-%d %I:%M %p.
# Функция CurrenTimeNode(%Y-%m-%d %I:%M %p) - это наша функция типа Node.

import datetime

class CurrentTimeNode(template.Node):

    def __init__(self, format_string):
        self.format_string = format_string

    def render(self, context):
        now = datetime.datetime.now()
        return now.strftime(self.format_string)

# Функция __init__() производит компиляцию шаблонного тэга.
# Функция render() производит рендеринг шаблонного тэга.


# Регистрация нашего тэга.

from django import template

register = template.Library()

register.tag('current_time', do_current_time) # 1 -  имя тэга, 2 - функция компиляции тэга.


# Альтернативный вариант регистрации шаблонного тэга.

@register.tag('current_time', do_current_time)
def do_current_time(parser, token):
    try:
        tag_name, format_string = token.split_contents()
    except ValueError:
        msg = '%r tag requires a single argument' % token.split_contents()[0]
        raise template.TemplateSyntaxError(msg)
    return CurrenTimeNode(format_string[1:-1])

@register.tag
def shout(parser, token):
    pass

# Если вы не укажете аргумент name в @register.tag, то Django будет использовать имя функции в качестве имени тега.



# Полный пример шаблонной библиотеки тэгов.

/templatetags/filters.py

from django import template

register = template.Library()

@register.tag('current_time', do_current_time)
def do_current_time(parser, token):
    try:
        tag_name, format_string = token.split_contents()
    except ValueError:
        msg = '%r tag requires a single argument' % token.split_contents()[0]
        raise template.TemplateSyntaxError(msg)
    return CurrenTimeNode(format_string[1:-1])

@register.tag('shout', shout)
def shout(parser, token):
    pass


# Пример двойного шаблонного тэга.

{% upper %}
    This will appear in uppercase, {{ your_name }}.
{% endupper %}


from django import template

register = template.Library()

@register.tag
def do_upper(parser, token):
    nodelist = parser.parse(('endupper',))
    parser.delete_first_token()
    return UpperNode(nodelist)

class UpperNode(template.Node):

    def __init__(self, nodelist):
        self.nodelist = nodelist

    def render(self, context):
        output = self.nodelist.render(context)
        return output.upper()

Djnago Создание собственных шаблонных фильтров

/templatetags/filters.py

from django import template

register = template.Library()


# Или традиционно можно записать так:

from django.template import Library

register = Library()


# Регистрация фильтров.

register.filter('cut', cut) # 1 - имя фильтра, 2 - сама функция фильтра.
register.filter('lower', lower) # 1 - имя фильтра, 2 - сама функция фильтра.


# Функция фильтра.

def cut(value, arg): # 1 - значение переменной в шаблоне, 2 - параметр самого фильтра.
    "Удаляет все значения аргумента arg из строки value."
    return value.replace(arg, '')

# Пример использования нашего фильтра.

# {{ my_var|cut:'0' }}



# Функция фильтра.

def lower(value): # 1 - значение переменной в шаблоне, 2 - параметра самого фильтра нет.
    "Преобразовывает регистр строки в строчный."
    return value.lower()

# Пример использования нашего фильтра.

# {{ my_var|lower }}


# Альтернативный вариант регистрации фильтров.

@register.filter(name='cut')
def cut(value, arg):
    return value.replace(arg, '')

@register.filter
def lower(value):
    return value.lower()

# Если вы опустите аргумент name в @register.filter, как это сделано во втором примере, то Django будет использовать имя функции в качестве имени фильтра.



# Полный пример шаблонной библиотеки фильтров.

/templatetags/filters.py

from django import template

register = template.Library()

@register.filter(name='cut')
def cut(value, arg):
    return value.replace(arg, '')

@register.filter(name='lower')
def lower(value):
    return value.lower()

вторник, 5 марта 2013 г.

Python *args и **kwargs - переменное число аргументов в функциях

В языке Python функциям позволяется принимать разное количество произвольных аргументов, имена которых неизвестны до момента выполнения кода.

Если поместить одну звёздочку * перед параметром в определении функции, то любые неименованные аргументы будут развёрнуты в единый кортеж.

*args - это кортеж (1, 2, 3) со значениями переменных, подставленных в функцию.

Если поместить две звёздочки ** перед параметром в определении функции, то любые именованные аргументы будут развёрнуты в хэш-массив (словарь).

**kwargs - это хэш-массив {'a': 1, 'b': 2, 'c': 3} с ключами и значениями переменных, подставленных в функцию.

Пример.

>>> def foo(*args):
...         print(args)

>>> foo(1, 2, 3)
1, 2, 3



>>> def foo(**kwargs):
...         print(kwargs)

>>> foo(a = 1, b = 2, c = 3)
{'a': 1, 'b': 2, 'c': 3}



>>> def foo(*args, **kwargs):
...         print ("Positional arguments are:")
...         print (args)
...         print ("Keyword arguments are:")
...         print (kwargs)

>>> foo(1, 2, 3, a = 1, b = 2, c = 3)
Positional arguments are:"
1, 2, 3
Keyword arguments are:
{'a': 1, 'b': 2, 'c': 3}

Django Собственная валидация полей формы

Для добавления собственной валидации полей ввода формы необходимо создать для каждого поля собственный метод проверки, начинающийся со слова clean_ и подставить после него название поля, которое мы хотим проверить.

В результате Django автоматически найдет метод с таким названием и использует его в процессе валидации этого поля формы.

Сначала Django выполнит стандартную валидацию вида: заполнено поле или пусто, а затем выполнит ваш метод clean_, в коде которого будет производится ваша проверка данного поля формы. Если проверка завершится неуспешно, то рядом с полем будет выведено прописанное вами сообщение об ошибке raise forms.ValidationError('Тут ваше сообщение об ошибке.')

Пример.

class ContactForm(forms.Form):
    subject = forms.CharField(max_length = 100)
    email   = forms.EmailField(required = False)
    message = forms.CharField(widget = forms.Textarea)
   
    def clean_subject(self):
        subject = self.cleaned_data['subject']
        num_words = len(message.split())
        if num_words < 4:
            raise forms.ValidationError('Not enough words!')
        return subject

понедельник, 4 марта 2013 г.

Django Admin Model

books/admin.py

from django.contrib import admin

class BookAdmin(admin.ModelAdmin):

    search_fields  = ('first_name', 'last_name',)
    list_display     = ('first_name', 'last_name', 'email',)
    filter_display   = ('publication_date',)

    date_hierarchy = 'publication_date'
    ordering           = ('-publication_date',)

    fields                = ('title', 'authors', 'publisher', 'publication_date',)
    filter_horizontal = ('authors',)
    filter_vertical     = ('authors',)

    raw_id_fields = ('publisher',)

admin.site.register(Book, BookAdmin)

Django Стандарнтый набор файлов в приложении App

/mysite
       /books
             __init__.py
             models.py
             views.py
             urls.py
             admin.py
             forms.py

Django Русификация Админки

Если английский не является вашим основным языком, то вы можете легко настроить интерфейс администратора на отображение информации на нужном вам языке. Для это в конфигурационном файле добавьте:

'django.middleware.locale.LocaleMiddleware',

в MIDDLEWARE_CLASSES.

Убедитесь, что оно следует после

'django.contrib.sessions.middleware.SessionMiddleware',

После этого перегрузите главную страницу административного интерфейса.

Если присутствует перевод для вашего языка, различные части интерфейса отобразятся на вашем языке вместо английского.

Django Создание логина и пароля Суперпользователя

python manage.py createsuperuser

Django Model Create, Get, Update, Delete

# IMPORT

from mysite.books import Publisher


--------------------------------------------------------------------------

# CREATE

p = Publisher(name='Boris', age = 30)
p.save()

OR

Publisher.objects.create(name='Boris', age=30)

--------------------------------------------------------------------------

# UPDATE

p = Publisher.objects.get(id=1)
p.name = 'Tom'
p.save()

--------------------------------------------------------------------------

# GET

Publisher.objects.all()
Publisher.objects.all()[0:2]
Publisher.objects.get(name='Boris')
Publisher.objects.filter(name__contains='Bor')
Pyblisher.objects.order_by('-name')

--------------------------------------------------------------------------

# DELETE

Publisher.objects.get(name='Boris').delete()

пятница, 1 марта 2013 г.

Djnago Русские буквы в браузере

Если в результате выполнения вашего кода Django в браузере не выводятся русские буквы, а выводится абракадабра, то вам необходимо сделать следующее.

Добавьте в файл первой строкой следующий комментарий.

#-*- coding: utf-8 -*-

Сохраните ваш файл в кодировке UTF-8 без BOM.

После этого русские буквы в браузере должны будут появиться.

Пример.

Файл views.py

#-*- coding: utf-8 -*-

from django.http import HttpResponse

def hello(request):
    return HttpResponse('Здраувствуй, мир!')

Djnago Принудительный вывод страницы с отладочной информацией

В контроллере внутри акшон-метода (функции) страницы, которую вы хотите протестировать, чтобы узнать какие параметры ей передаются из формы, вы можете первой строкой прописать assert False. Это приведет к выводу стандартной страницы Django с сообщением об ошибке и всем списком переданных ей параметров.

def function_that_raises_an_exception():
    assert False
    ...

Django Debug

Если необходимо иметь информацию о том, что происходит при выполнении функции представления, самым быстрым способом будет поместить в представление оператор print. Сервер разработки выводит результат обработки оператора print напрямую на терминал. Это альтернатива со стороны сервера JavaScript-функции alert().

Django Методы класса Model

class Person(models.Model):
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=40)

    class Meta:
        pass

    class Admin:
        pass

    def __unicode__():
        pass

    def __str__():
        pass

    def get_absolute_url():
        pass