tropy on django

tropyをdjangoで作ってみました。

まずはソース(settings.pyとかは省く)

/tropy/models.py

from django.db import models

class Tropy(models.Model):
    url = models.CharField(maxlength=8, primary_key=True)
    body = models.TextField()

    def get_absolute_url(self):
        return '/tropy/%s' % self.url

/tropy/views.py

from django.http import HttpResponseRedirect
from tropy.models import Tropy

import random
import string

def random_url(request):
    o = random.choice(Tropy.objects.all())

    return HttpResponseRedirect('/tropy/%s/' % o.url)

def post(request):
    
    from_data = request.POST.copy()
    
    url = ''.join([random.choice(string.digits) for i in range(8)])
    body = from_data['body'] 
    o = Tropy(url=url, body=body)
    o.save()

    return HttpResponseRedirect('/tropy/%s/' % o.url)

/tropy/urls.py

from django.conf.urls.defaults import *
from django.views.generic import (list_detail, simple, create_update)

from tropy.models import Tropy
from tropy.views import (random_url, post)

query_dict = dict(queryset=Tropy.objects.all())
model_dict = dict(model=Tropy)

urlpatterns = patterns('',
    (r'^$', simple.redirect_to, dict(url='/tropy/random/')),

    (r'^random/$', random_url),

    (r'^(?P<object_id>\d+)/$', list_detail.object_detail, 
        dict(query_dict)),

    (r'^create/$', simple.direct_to_template, 
        dict(template='tropy/tropy_create.html')),

    (r'^post/$', post),

    (r'^update/(?P<object_id>\d+)/$', create_update.update_object, 
        dict(model_dict, template_name='tropy/tropy_update.html')),
)

/templates/tropy/tropy_detail.html

<a href="/tropy/create/">create</a>
<a href="/tropy/update/{{ object.url }}">update</a>
<a href="/tropy/random/">random</a>

<p>{{ object.body|striptags|linebreaksbr }}</p>

/templates/tropy/tropy_create.html

<form action="/tropy/post/" method="post">
    <p><textarea id="id_body" class="vLargeTextField required" name="body" rows="10" cols="40"></textarea></p>
    <p><input type="submit" value="post" class="submit" onclick="post()"/></p>
</form>

/templates/tropy/tropy_update.html

<form action="." method="post">
    <p>{{ form.body }}</p>
    <p><input type="submit" value="post" class="submit" onclick="post()"/></p>
</form>

出来る限りGenericViewを使おうと思いましたが、create_objectで挫折。
結局viewsに書いてしまいました。

newformsを使おうと思ったらTextFieldが無かった件
(CharFieldのmax_lengthをあげるとTextFieldになったり…しないよなぁ)

もっとスマートな書き方があると思いますので、突っ込み大歓迎です。

Tropyを作る場合は人それぞれの癖が出るような気がします。

Djangoの勉強がてらtropyを作ってみるというのはいかがでしょうか?

それにしてもソースが読みにくいな…。

誰も使わないと思いますが使い方を一応。
最初はデータが入っていないのでエラーが返されます。
よって/tropy/create/に飛んで、なにかをpostします。

そうすれば後はご自由に:-p

こっそりと置いておく
http://djaropy.googlecode.com/svn/trunk/

tropy on django
tropy on django posted from フォト蔵