1

古い Django プロジェクト (Django 1.4 で最後に動作) を更新して、クラス ベースのジェネリック ビュー (Django 1.5) を使用しようとしています。

以下は以前は機能していました

テンプレート:

{% block content %}
    {% for month in date_list %}
        <h2><a href="{% url coltrane_entry_archive_month year,month|date:"b" %}">{{ month|date:"F" }}</a></h2>
        <h2>Blah</h2>
    {% endfor %}
{% endblock %}

urls.py

urlpatterns = patterns('django.views.generic.date_based',
...   
    (r'^(?P<year>\d{4})/$', 'archive_year', dict(entry_info_dict,make_object_list=True), 'coltrane_entry_archive_year'),
    (r'^(?P<year>\d{4})/(?P<month>\w{3})/$', 'archive_month', entry_info_dict, 'coltrane_entry_archive_month'),
...
)

ただし、ジェネリッククラスを使用するようにurls.pyを更新したとき

class ArticleYearArchiveView(YearArchiveView):
    queryset = Entry.objects.all()
    date_field = "pub_date"
    make_object_list = True
    allow_future = True

urlpatterns = patterns('',
...
    url(
        r'^(?P<year>\d{4})/$',
        ArticleYearArchiveView.as_view(),
        name='coltrane_entry_archive_year'
    ),
    url(
        r'^(?P<year>\d{4})/(?P<month>\w{3})/$',
        dates.MonthArchiveView.as_view(
            template_name='coltrane/entry_archive_month.html',
            queryset=Entry.objects.filter(status=Entry.LIVE_STATUS),
            date_field='pub_date'),
        name="coltrane_entry_archive_month"
    ),
...
)

次の TemplateSyntaxError が表示され始めます。

一部の文字を解析できませんでした: year|、month||date:"b"

以下を使用して、テンプレートをレンダリングし、coltrane_entry_archive_month に何が渡されているかを確認できます。

{% for month in date_list %}
    {{ year }}
    {{ month|date:"b" }}
{% endfor %}

{{ year }} が 'Jan. URL の正規表現に一致する '2013' ではなく 1, 2013'。これはわかりません。

次に、次のレンダリングを試みました。

{% for month in date_list %}
    {% url "coltrane_entry_archive_month" "2013","apr" %}
{% endfor %}

今回の TemplateSyntaxError は次のとおりです。

残りを解析できませんでした: '"2013","apr"' からの ',"apr"'

ジェネリック クラス ビューと URL の両方が Django の大きなトピックのように思われるので、ポインタは大歓迎です!

4

1 に答える 1

1

urlタグは、カンマ区切りの引数を取りません。スペースを入れて列挙するだけです。

{% for month in date_list %}
    {% url "coltrane_entry_archive_month" "2013" "apr" %}
{% endfor %}

つまり、実際のテンプレートを次のように変更する必要があります

{% url "coltrane_entry_archive_month" year month|date:"b" %}

また、単なるメモ(2番目の例であなたが従ったことに気づきました)

関数パスまたはパターン名を引用符で囲むことを忘れないでください!

Django 1.5 で変更: 最初のパラメーターは引用符で囲まれていませんでしたが、これは他のテンプレート タグと矛盾していました。Django 1.5 以降、通常の規則に従って評価されます。引用符で囲まれた文字列またはコンテキストで検索される変数にすることができます。

于 2013-04-10T19:12:07.033 に答える