2

Djangoを始めたばかりですが、少し壁にぶつかりました。django-basic-appsライブラリを参照しながら、簡単なブログエンジンを作成してみることにしました。

blog / urls.pyには、日付ごとに実際の投稿にマップするためのこのエントリがあります。例:blog / 2009 / aug / 01 / test-post

urlpatterns = patterns('',
    url(r'^(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{1,2})/(?P<slug>[-\w]+)/$', 'blog.views.post_detail'),
    ...

そして、投稿をレンダリングするためのビュー:

def post_detail(request, slug, year, month, day, **kwargs):
return date_based.object_detail(
    request,
    year = year,
    month = month,
    day = day,
    date_field = 'created_at',
    slug = slug,
    queryset = Content.objects.filter(published=True),
    **kwargs
)

モデルではget_absolute_url、メインのブログページの1つで、投稿のタイトルをクリックして表示できるように実装しました。

class Content(models.Model):
    ...
@permalink
def get_absolute_url(self):
    return ('blog.views.post_detail', (), {
        'slug': self.slug,
        'year': self.created_at.year,
        'month': self.created_at.strftime('%b').lower(),
        'day': self.created_at.day
    })

最後に、メインページの投稿リストでは、パーマリンクがタイトルに挿入されることになっています。

{% for content in object_list %}
<div class="content_list">
<h3 class="content_title"><a href="{{ content.get_absolute_url }}">{{ content.title }}</a></h3>
<p class="content_date">{{ content.published_at|date:"Y F d"}}</p>
<p class="content_body">{{ content.body }}</p>
<p class="content_footer">updated by {{ content.author }} at {{ content.updated_at|timesince }} ago</p>
</div>
{% endfor %}

content.get_absolute_url()ただし、リンクは空として表示され、djangoシェルから呼び出そうとすると、エラーがスローされます。

NoReverseMatch: Reverse for '<function post_detail at 0xa3d59cc>' with arguments '()' and keyword arguments '{'year': 2009, 'slug': u'another_test', 'day': 15, 'month': 'aug'}' not found.

編集:それはPython名前空間の問題であることが判明しました(以下を参照)。しかしとにかく、上記のような私のurls.pyは正しくありませんでしたか?

4

1 に答える 1

3

他の初心者 Django チュートリアルを探し回って、すべての URL を親フォルダー urls.py に入れるというアイデアを得て、それで問題が解決したようです。:) 結局、私のメインのurls.pyは次のようになりました。

from djangoblog.blog import views
urlpatterns = patterns('',

    (r'^blog/(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{1,2})/(?P<slug>[-\w]+)/$',
    views.post_detail),
    (r'^blog/(?P<year>\d{4})/(?P<month>\w{3})/(?P<day>\d{1,2})/$',
    views.post_archive_day),
    ...

編集: 編集: 2 日間のカジュアルなハッキングの後、幸いなことに、URLconfs + django ビューがよりよく理解できるようになりました。:) パターンを blog/urls.py に戻し、カスタムの日付ベースのビューをすべて取り除き、代わりに urls.py からそれらを呼び出し、@permalinked が必要なアイテムのパターンに適切な名前を付けました。

名前付きパターンのurls.py :

from blog import views
...
(r'(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{1,2})/(?P<slug>[-\w]+)/$',
    'object_detail', dict(info_dict, slug_field='slug', month_format='%m'),
    'post_detail'),
...
(r'category/(?P<slug>[-\w]+)/$', views.category_detail),

models.py:

class Post:
    @permalink
    def get_absolute_url(self):
    return ('post_detail', (), {
                  ....

class Category:
    @permalink
def get_absolute_url(self):
    return ('blog.views.category_detail', (), {'slug': self.slug})
于 2009-09-12T16:23:53.280 に答える