3

注意:この質問は、最初の回答が出る前に大幅に編集されています。

やあ、

私はdjangoにかなり慣れていないので、明らかな何かが欠けている場合はお詫びします。

次のようなurls.pyファイルがあります。

urlpatterns = patterns(
    '',
    (r'^$', 'faros.lantern.views.home_page'),
    (r'^login/$', 'django.contrib.auth.views.login'),
    (r'^logout/$', 'django.contrib.auth.views.logout'),
    (r'^about/$', 'faros.lantern.views.about_page_index', {}, 'about_page_index'),
    (r'^about/(?P<page_id>([a-z0-9]+/)?)$', 'faros.lantern.views.about_page', {}, 'about_page'),
)

次のようなビュー:

def about_page_index(request):
    try:
        return render_to_response('lantern/about/index.html', context_instance=RequestContext(request))
    except TemplateDoesNotExist:
        raise Http404

def about_page(request, page_id):
    page_id = page_id.strip('/ ')

    try:
        return render_to_response('lantern/about/' + page_id + '.html', context_instance=RequestContext(request))
    except TemplateDoesNotExist:
        raise Http404

そしてこれを含むテンプレート:

<a href="{% url lantern.views.about_page_index %}">Contact</a>
<a href="{% url lantern.views.about_page page_id="contact" %}">Contact</a>

このエラーメッセージが表示されます:

Caught an exception while rendering: Reverse for '<function about_page at 0x015EE730>' with arguments '()' and keyword arguments '{'page_id': u'contact'}' not found. The first reverse works fine (about_page_index), generating the correct URL without error messages.

これは、about_pageビュー(request)へのリクエスト引数が使用されているためだと思います。そのため、テンプレートでURLを生成するときにそれを渡す必要があります。問題は、私はそれに到達する方法がわからないことです、そして周りを検索しても私はどこにも行きません。何か案は?

ありがとう、

ドム

ps余談ですが、アプリで静的な「約」タイプのページを処理するその方法は、恐ろしいまたは合理的に見えますか?私は基本的にURLを取得しており、テンプレートへのパスはabout/ビットの後に来るものであると想定しています。つまり、静的ページをアプリの一部のように見せることができるので、ユーザーはaboutセクションにジャンプして、元の場所に戻ることができます。これがジャンゴイックなのかバカなのかについてのコメント/フィードバックに感謝します!

4

1 に答える 1

9

ビュー関数 ( ) のシグネチャから正しく推測できればdef about_page(request, page_id = None):、同じビューを指しているがパラメータを取らない別の URL 構成がある可能性がありpage_idます。その場合、django の逆関数はこれらの 1 つだけを認識し、名前付きのpage_id正規表現パターンを持たないものを認識している可能性があります。これは、リバースに関するかなり一般的な落とし穴です。:-)

これを回避するには、各 URL パターンに名前を割り当てます (「urlpatterns 変数の構文」を参照)。あなたの例の場合、次のようにします。

(r'^about/(?P<page_id>([a-z]+/)?)$', 'faros.lantern.views.about_page', 
 {}, 'about_with_page_id')

そして、テンプレートで:

<a href="{% url about_with_page_id page_id="contact" %}">Contact</a>

編集

更新された urls.py を投稿していただきありがとうございます。テンプレートタグではurl、修飾されていないパターン名を使用するとうまくいくはずです(次のlantern.views部分を削除していることに注意してください:

<a href="{% url about_page_index %}">Contact</a>
<a href="{% url about_page page_id="contact" %}">Contact</a>

編集2

申し訳ありませんが、以前にこれに気を配っていませんでした。あなたのパターンは、ジャンゴが元に戻すことができない方法で表現されており、これが不一致の原因です。それ以外の:

r'^about/(?P<page_id>([a-z]+/)?)$'

使用する:

r'^about/(?P<page_id>[a-z0-9]+)/$'

あなたのシステムに一致するダミー プロジェクトをシステムに作成し、エラーを再現し、この修正を挿入して成功させました。これで問題が解決しない場合は、帽子を食べるつもりです。:-)

于 2009-04-13T19:58:27.683 に答える