Django Blog - views.py書いたら負けだと思っている - - MiCHiLU.com

[Presen][Django]: Django Blog - views.py書いたら負けだと思っている -

まちがって、LT作ってたのでUPしちゃう。(未完)

Django Blog

— views.py書いたら負けだと思っている —

メニュー

djangoproject

INDEX

djangoproject

  1. Genric views
  2. FreeComments
  3. Syndication Feed
  4. Sitemap
  5. Blog tools
  6. Django Development, TDD
  7. settings.py

Documentation

Django オンラインドキュメント和訳

http://ymasuda.jp/python/django/docs/

よく読む。

Documentation

Django Quick Reference

Python Library Reference

Download Now !

覚えること

settings.py

django.conf.settings

$ ./manage.py diffsettings

models.py

django.db.models.base.Model

class Tag(models.Model):
    value = models.CharField(maxlength=100, )
    def __str__(self):
        return self.value[:20]
    title = property(__str__)
    class Admin:
        list_display = ("title", )

Genric views

django.views.generic

django.views.generic. simple

  • direct_to_template
  • redirect_to

django.views.generic. list_detail

django.views.generic. date_based

django.views.generic. create_update

urls.py

URL dispatch

url = view + model + template

urls.py

urlpatterns += patterns("path_to_view",
    (r'^url(?P<url_value>pattern)$', "views_def",
        {"queryset": Entry.objects.all(),
            "template_name":"blog/index.html"}),
    (r'^blog/', include('app.blog.urls')),
)

settings. APPEND_SLASH

True (default)
  • 301 => /append_slash/
False
  • /non_slash

templates

Extends

継承元テンプレートの一部分を書き換える

Include

参照元ファイルの内容を組み込む

templates

default path

<project>/templates/<app_name>/

template.html

{% extends "base.html" %}   {% load markup %}
{% block content %}
    {{ object.content|restructuredtext }}
    {{ object.add_date|date:"r" }}
    <a href="/">[Back]</a>
{% endblock %}
{% block footer %}
    {% include "navi.html" %}
{% endblock %}

proj.app.models. Entry

class Entry(models.Model):
    content = models.TextField(blank=False)
    tag = models.ManyToManyField( \
        Tag, blank=True, editable=False)
    add_date = models.DateTimeField( \
        auto_now_add=True, editable=False)
    mod_date = models.DateTimeField( \
        auto_now=True, editable=False)

Entry.save

class Entry(models.Model):
    ...
    def save(self):
        super(Entry, self).save()
        for tag in self._title_to_tags():
          obj, created = \
            Tag.objects.get_or_create(value=tag)
          self.tag.add(obj)

proj.app.models. Tag

class Tag(models.Model):
    value = models.CharField(maxlength=100, \
        unique=True, blank=False)

    def __str__(self):
        return self.value

Entry.title

class Entry(models.Model):
    ...
    def _title(self):
        line = self._title_line()
        if len(line) >= 2:
            return ":".join(line[1:])
        return line[0]
    title = property(_title)

組み込みの機能

FreeComments

FreeComments - 詳しく

Syndication Feed

Sitemap

Blog 便利ツール

他にも

アサマシ Tag

http://web-ya.jp/blog/2007/02/05/ asin-to-asamashi/

JSON-RPC, XML-RPC

http://django.g.hatena.ne.jp/ Voluntas/20061214/p1 http://code.djangoproject.com/wiki/XML-RPC http://code.djangoproject.com/wiki/JSON-RPC http://www.freenet.org.nz/dojo/pyjson/

Django Ajax library

http://code.google.com/p/djax/

Django Pipe Midlleware

http://code.google.com/p/ django-pipe-middleware/

djblogkit

http://static.everes.net/ related/stuff/djblogkit.zip

Enjoy !!! Django Development

Tools

Tools

IPython:
http://www.livejournal.com/userpic/42237442/1879352
Firebug:
http://www.getfirebug.com/images/firebug2.png
svk + trac:
http://www.edgewall.org/gfx/trac_logo.png

IPython

$ ./manage.py shell
Python 2.4.4 (#1, Oct 18 2006, 10:34:39)
Type "copyright", "credits" or "license" for more information.

IPython 0.7.3 -- An enhanced Interactive Python.
?       -> Introduction to IPython's features.
%magic  -> Information about IPython's 'magic' % functions.
help    -> Python's own help system.
object? -> Details about 'object'. ?object also works, ?? prints more.

IPython

In [1]: from django.conf import settings
In [2]: settings?
Type:           LazySettings
Base Class:     <class 'django.conf.LazySettings'>
String Form:    <django.conf.LazySettings object at 0x1074d70>
Namespace:      Interactive
Docstring:
    A lazy proxy for either global Django settings or a custom settings object.
...

IPython

In [3]: settings.<TAB-KEY>
Display all 101 possibilities? (y or n)
settings.ABSOLUTE_URL_OVERRIDES
settings.ADMINS
settings.ADMIN_FOR
settings.ADMIN_MEDIA_PREFIX
settings.ALLOWED_INCLUDE_ROOTS
settings.APPEND_SLASH
--More--

Firebug

Commands

$ ./manage.py syncdb
$ ./manage.py runserver
$ ./manage.py test (<app>)
$ ./manage.py reset <app>

$ sqlite3 my.db .dump >mydb.sql
$ sqlite3 my.db <mydb.sql

Initialize Database

<proj>/<app>/sql/ <model>(.<dbtype>).sql

TDD

  1. tests.py
  2. urls.py (Generic Views)
  3. models.py
  4. templates
  5. commit; svn up; Django restart;
  6. Refactoring

tests.py 使い方

$ ./manage.py test
Creating test database...
...
Installing index for admin.LogEntry model
....
Ran 4 tests in 8.030s
OK
Destroying test database...

too Faster !

20 sec (r4525)

=>

3 sec (r4672)

(※当社比 6倍)

TEST first

<proj>/<app>/tests.py

# -*- coding: utf-8 -*-
"""
>>> from django.test.client import Client
>>> from BeautifulSoup import BeautifulSoup
>>> c = Client()
>>> response = c.get("/")
>>> BeautifulSoup(response.content).html.title
<title>Djangoと日本の仲間たち</title>
"""

BeautifulSoup

イイ!

http://www.crummy.com/software/BeautifulSoup/10.1.jpg

Traceback Page - 404

http://127.0.0.1:8000/notfound

Page not found (404)
Request Method:     GET
Request URL:        http://127.0.0.1:8000/notfound

Traceback Page - 500

http://127.0.0.1:8000/notemplate

TemplateDoesNotExist at /notemplate
blog/index.html

Request Method:     GET
Request URL:        http://127.0.0.1:8000/notemplate
Exception Type:     TemplateDoesNotExist
Exception Value:    blog/index.html

./manage.py test

File "/path-to/<prje>/<app>/tests.py", line 10, in <prje>.<app>.tests
Failed example:
    for url in checklist.keys(): #テンプレテスト
        response = c.get(url)
        if response.template.name != checklist[url]:
            url, checklist[url], response.template.name
Exception raised:
    ...
    TemplateDoesNotExist: 500.html

404.html 500.html

<prject>/templates/

test - models.py

testing tools

settings.py の書き方

settings.DEBUG

import os.path

DEBUG = (False, True)[0]
if os.path.exists("../_debug"):
    DEBUG = (False, True)[1]
$ touch ../_debug
$ rm ../_debug

settings. DATABASE_NAME

import os.path
_proj_name = \
    os.path.split(os.path.abspath(""))[-1]

DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = \
    os.path.abspath('../db/%s.db' % _proj_name)

settings. TEMPLATE_DIRS

import os.path

TEMPLATE_DIRS = (
os.path.abspath('templates').replace(os.sep,"/"),
)

settings. CUSTOM_TEST

import sys

CUSTOM_TEST = False
if sys.argv[1] == "test":
    CUSTOM_TEST = True

settings. CACHE_BACKEND

if CUSTOM_TEST:
    CACHE_BACKEND = 'dummy:///'
    t = []
    for i in MIDDLEWARE_CLASSES:
        if i != "django.middleware.cache.CacheMiddleware":
            t.append(i)
    MIDDLEWARE_CLASSES = tuple(t)

settings.*

if DEBUG:
    import imp
    _optional_settings = "_settings"
    _settings = None
    try:
        f, fn, desc = imp.find_module(_optional_settings, ["../"])
        _settings = imp.load_module(_optional_settings, f, fn, desc)
    except ImportError:
        pass
    if _settings:
        for key in _settings.__dict__.keys():
            if key[0] != "_":
                vars()[key] = _settings.__dict__[key]

settings.**

http://ymasuda.jp/python/ django/docs/settings.html

settings.ABSOLUTE_URL_OVERRIDES
settings.ADMINS
settings.ADMIN_FOR
settings.ADMIN_MEDIA_PREFIX
settings.ALLOWED_INCLUDE_ROOTS
settings.APPEND_SLASH
settings.AUTHENTICATION_BACKENDS
settings.AUTH_PROFILE_MODULE
settings.BANNED_IPS
settings.BUILDING_DOCS
settings.CACHE_BACKEND
settings.CACHE_MIDDLEWARE_ANONYMOUS_ONLY
settings.CACHE_MIDDLEWARE_KEY_PREFIX
settings.CACHE_MIDDLEWARE_SECONDS
settings.COMMENTS_ALLOW_PROFANITIES
settings.COMMENTS_BANNED_USERS_GROUP
settings.COMMENTS_FIRST_FEW
settings.COMMENTS_MODERATORS_GROUP
settings.COMMENTS_SKETCHY_USERS_GROUP
settings.DATABASE_ENGINE
settings.DATABASE_HOST
settings.DATABASE_NAME
settings.DATABASE_OPTIONS
settings.DATABASE_PASSWORD
settings.DATABASE_PORT
settings.DATABASE_USER
settings.DATETIME_FORMAT
settings.DATE_FORMAT
settings.DEBUG
settings.DEFAULT_CHARSET
settings.DEFAULT_CONTENT_TYPE
settings.DEFAULT_FROM_EMAIL
settings.DISALLOWED_USER_AGENTS
settings.EMAIL_HOST
settings.EMAIL_HOST_PASSWORD
settings.EMAIL_HOST_USER
settings.EMAIL_PORT
settings.EMAIL_SUBJECT_PREFIX
settings.ENABLE_PSYCO
settings.FIXTURE_DIRS
settings.IGNORABLE_404_ENDS
settings.IGNORABLE_404_STARTS
settings.INSTALLED_APPS
settings.INTERNAL_IPS
settings.JING_PATH
settings.LANGUAGES
settings.LANGUAGES_BIDI
settings.LANGUAGE_CODE
settings.LOCALE_PATHS
settings.MANAGERS
settings.MEDIA_ROOT
settings.MEDIA_URL
settings.MIDDLEWARE_CLASSES
settings.MONTH_DAY_FORMAT
settings.PREPEND_WWW
settings.PROFANITIES_LIST
settings.RESTRUCTUREDTEXT_FILTER_SETTINGS
settings.ROOT_URLCONF
settings.SECRET_KEY
settings.SEND_BROKEN_LINK_EMAILS
settings.SERIALIZATION_MODULES
settings.SERVER_EMAIL
settings.SESSION_COOKIE_AGE
settings.SESSION_COOKIE_DOMAIN
settings.SESSION_COOKIE_NAME
settings.SESSION_COOKIE_SECURE
settings.SESSION_EXPIRE_AT_BROWSER_CLOSE
settings.SESSION_SAVE_EVERY_REQUEST
settings.SETTINGS_MODULE
settings.SITE_ID
settings.TEMPLATE_CONTEXT_PROCESSORS
settings.TEMPLATE_DEBUG
settings.TEMPLATE_DIRS
settings.TEMPLATE_LOADERS
settings.TEMPLATE_STRING_IF_INVALID
settings.TESTS_DATABASE_NAME
settings.TEST_DATABASE_NAME
settings.TEST_RUNNER
settings.TIME_FORMAT
settings.TIME_ZONE
settings.TRANSACTIONS_MANAGED
settings.URL_VALIDATOR_USER_AGENT
settings.USE_ETAGS
settings.USE_I18N
settings.YEAR_MONTH_FORMAT
settings.k

settings.**

settings.AUTH_PROFILE_MODULE
settings.BUILDING_DOCS
settings.FIXTURE_DIRS
settings.RESTRUCTUREDTEXT_FILTER_SETTINGS
settings.SERIALIZATION_MODULES
settings.k

settings. AUTH_PROFILE_MODULE

DjangoのUserモデルを拡張する

http://blog.monospace.jp/2006/08/01/ django-extending-usermodel/

settings. RESTRUCTUREDTEXT_FILTER_SETTINGS

RESTRUCTUREDTEXT_FILTER_SETTINGS = {
    'doctitle_xform': False,
}

settings.**

$ cd django_trunk
$ grep "settings\.[A-Z]?*" **/*.py |wc -l
    1554
$ grep "getattr(settings" **/*.py |wc -l
      17

more Django !