2017-08-31 8 views
2

私はDjangoで簡単な検索フォームを作成しようとしています。ここで私はこれまで持っているものです。NoReverseMatch:テンプレートから表示にパラメータを渡すことができません。

形式:

<form action="{% url 'search_pub' pub_name=pub_name %}" method="get"> 
    Publication name: <input type="text" id="pub_name" name="pub_name" value="herald"> 
    <input type="submit" value="Search"> 
</form> 

urls.py

url(r'^search/$', views.search, name='search'), 
url(r'^results/(?P<pub_name>[\w]+)/$', views.search_pub, name='search_pub'), 

views.py

def search(request): 
    return render(request, 'urlapp/search.html') 

def search_pub(request, pub_name): 
    pubs = Publication.objects.all().filter(title__icontains=pub_name) 
    return render(request, 'app/results.html', { 
     'publications': pubs 
    }) 

models.py

class Publication(models.Model): 
    title = models.CharField(max_length=30) 

私はhttp://localhost:8000/search/で検索ページを開いたとき、私は次のエラーを取得する:

NoReverseMatch at /search/ 
Reverse for 'search_pub' with keyword arguments '{'pub_name': ''}' not found. 1 pattern(s) tried: ['results/(?P<pub_name>[\\w]+)/$'] 

私は正規表現がサイトpythexを使用して有効であることを確認しました。

URL:http://localhost:8000/results/heraldに行った場合、正しい結果が得られます。

私には何が欠けていますか?

+0

値が空のようですか? – Rohan

+0

はい、私は理由を理解することができません。 – Animesh

答えて

1

GET変数はURL引数のように使用できません。また、{% url ...の値はサーバー側で計算されるため、HTML形式で動的に変更することはできません。私は、次の操作を行います:

まず、このように見えるようにビューのコードを変更し、その後

url(r'^results/$', views.search_pub, name='search_pub'), 

に次の行に

url(r'^results/(?P<pub_name>[\w]+)/$', views.search_pub, name='search_pub'), 

を変更:

最後に
def search_pub(request):     # Remove pub_name from method signature 
    pub_name = request.GET.get('pub_name') # ...and fetch it from GET dict instead 
    ... 

formタグを変更してください:

次の形式になり、今からあなたのURLのこと
<form action="{% url 'search_pub' %}" method="get"> 

注:

http://localhost:8000/results?pub_name=herald 

更新:

あなたが本当にURLに値を持っているしたい場合は、1からリダイレクトすることができます

あなたurls.pyと異なる名に両方のURLをキープ:他に

url(r'^results/(?P<pub_name>[\w]+)/$', views.search_pub, name='search_pub_clean'), 
url(r'^results/$', views.search_pub, name='search_pub'), 

とビューのコード:テンプレート内pub_name` `の

from django.shortcuts import redirect 
def search_pub(request, pub_name=None): 
    if pub_name is None: 
     return redirect('search_pub_clean', pub_name=request.GET.get('pub_name')) 
    ... 
+0

これはクエスチング文字の方法ですが、私はすでに試しています。しかし、私は '/ results/pubname/year'のようなきれいなURLを探しています。これを達成するための検索ページ専用のモデルとフォームを用意する必要がありますか? – Animesh

+0

する必要はありません。 2つのURL構成を持ち、一方から他方にリダイレクトすることができます。私の更新された答えを見てください。 – Selcuk

+1

これははるかに優れています。私は今対処するリダイレクトを持っています。 :) – Animesh

関連する問題