2016-12-30 40 views
1

我有一個HTML後有兩個下拉列表,我想送選擇這些列表中的search()方法是在views.pyCountry,然後送我去results視圖。每當我添加governmentlocation作爲參數的HTML POST操作或搜索正則表達式增加自己的價值,我試試這個,我收到了NoReverseMatch從我index頁:Django的HTML POST參數使NoReverseMatch

反向的「搜索」與參數「(」 ','')'和關鍵字參數'{}'找不到。 1個模式嘗試:['搜索/(?P [AZ] {3})/(?P [AZ] {3})/']

我不知道我是什麼做錯了導致這個錯誤。 (參見代碼中的註釋)

APPNAME/views.py:

from django.shortcuts import get_object_or_404, render 
from django.http import HttpResponseRedirect, HttpResponse 
from .models import Country, Embassy 
from django.template import loader 
from django.urls import reverse 


def index(request): 
    country = Country.objects.filter() 
    template = loader.get_template('appname/index.html') 
    context = {'countries': country} 
    return render(request, 'appname/index.html', context) 

def results(request, government, location): 
    return HttpResponse("Here are the Embassies sent by %s, located in %s." % (government, location)) 

def search(request): 
    countries = Country.objects.all() 
    form = request.POST 
    if request.method == 'POST': 
     try: 
      selected_government = get_object_or_404(pk=request.POST['government']) 
     except (KeyError, Country.DoesNotExist): 
      return render(request, 'appname/index.html', { 
       'error_message': "You didn't select a government.", 
      }) 
     try: 
      selected_location = get_object_or_404(pk=request.POST['location']) 
     except (KeyError, Country.DoesNotExist): 
      return render(request, 'appname/index.html', { 
       'error_message': "You didn't select a location.", 
      }) 
     else: 
      return HttpResponseRedirect(reverse('appname:results', args=(selected_government.code,selected_location.code,))) 

APPNAME /模板/應用程序的名字/ index.html的:

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %} 

# government and location in the form action causes a NoReverse Match 
<form action="{% url 'appname:search' government location %}" method="POST"> 
    {% csrf_token %} 
    <label>Find Embassies sent by</label> 
    <select name="government"> 
     {% for entry in countries %} 
      <option value="{{ entry.code }}">{{ entry.name }}</option> 
     {% endfor %} 
    </select> 
    <label>that are located in</label> 
    <select name="location"> 
     {% for entry in countries %} 
      <option value="{{ entry.code }}">{{ entry.name }}</option> 
     {% endfor %} 
    </select> 
    <input type="submit" value="Search" /> 
</form> 

urls.py:

from django.conf.urls import include, url 
from django.contrib import admin 

urlpatterns = [ 
    url(r'^', include('appname.urls')), 
    url(r'^appname/', include('appname.urls')), 
    url(r'^admin/', admin.site.urls), 
] 

appname/urls.py:

from django.conf.urls import url 

from . import views 

app_name = 'appname' 
urlpatterns = [ 
    url(r'^$', views.index, name='index'), 
    url(r'^(?P<embassy_id>[0-9]+)/$', views.embassy_info, name='embassy_info'), 
    url(r'^(?P<code>[A-Z]{3})/$', views.country_info, name='country_info'), 
    url(r'^find/(?P<government>[A-Z]{3})/(?P<location>[A-Z]{3})/$', views.results, name='results'), 
    # the government and location values in search regex also cause a NoReverse Match 
    url(r'^search/(?P<government>[A-Z]{3})/(?P<location>[A-Z]{3})/', views.search, name='search'), 
] 

APPNAME/models.py:

from django.db import models 

class Country(models.Model): 
    code = models.CharField(primary_key=True, max_length=3) 
    name = models.CharField(max_length=50, db_column="Name") 

    def __str__(self): 
     return self.name 

    class Meta: 
     verbose_name = 'Country' 
     verbose_name_plural = 'Countries' 


class Embassy(models.Model): 
    government = models.ForeignKey(Country, on_delete=models.CASCADE, related_name="government") 
    location = models.ForeignKey(Country, on_delete=models.CASCADE, related_name="location") 
    name = models.CharField(max_length=200, db_column="Name") 
    street_address = models.CharField(max_length=200, db_column="Address") 
    city = models.CharField(max_length=50, db_column="City") 
    phone_number = models.IntegerField(default=-1, db_column="Phone Number") 
    fax_number = models.IntegerField(null=True, blank=True, db_column="Fax Number") 
    email_address = models.CharField(max_length=200, db_column="Email") 
    website = models.CharField(max_length=200, db_column="Link") 

    def __str__(self): 
     return self.name 

    class Meta: 
     verbose_name = 'Embassy' 
     verbose_name_plural = 'Embassies' 

回答

1

它不喜歡的工作。 url標記的參數 - 實際上就像任何模板標記 - 必須來自在呈現時傳遞給模板的上下文。但是你試圖從表單本身動態地使用值。

您應該從URL模式中完全刪除參數。因爲你正確地從request.POST獲取值,所以你不會在視圖中使用它們。

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

...

<form action="{% url 'search' %}" ... 
+0

現在我就在和錯誤'get_object_or_404()失蹤1個人需要的位置參數: '克拉斯''從線'selected_government = get_object_or_404(PK = request.POST [ '政府'])'在views.py,不知道是什麼它意味着。無論在哪裏我的代碼中有我所用「克拉斯」 – user2361174

+0

你需要告訴該功能使用什麼型號:'get_object_or_404(政府,PK = request.POST [「政府」])'。 –

+0

我認爲你的意思是'國家',但是你說得對。 – user2361174

0

Django的網址解析反向需要的關鍵字參數作爲參數

reverse('search', kwargs={'government':goverment.code, 'location':location.code}) 

希望這有助於

+0

謝謝,但它似乎並沒有工作,我仍然得到同樣的錯誤。 – user2361174

+0

你不必在你的基地程式網址配置命名空間包含。所以你不應該需要appname作爲前綴。更新我的回答 –

+0

你的意思是'app_name ='appname''? – user2361174

1

你需要創建一個形式ModelChoiceField

forms.py

from django import forms 
from models import Country 

class SearchForm(forms.Form): 
    government = forms.ModelChoiceField(queryset=Country.objects.all(), to_field_name="code", label="Find Embassies sent by") 
    location = forms.ModelChoiceField(queryset=Country.objects.all(), to_field_name="code", label="that are located in") 

views.py

from forms import SearchForm 

def index(request): 
    form = SearchForm() 
    context = {'form': form} 
    return render(request, 'appname/index.html', context) 


def search(request): 
    form = SearchForm(request.POST or None) 
    if request.POST and form.is_valid(): 
     govt = form.cleaned_data.get('government') 
     loc = form.cleaned_data.get('location') 
     return HttpResponseRedirect(reverse('appname:results', kwargs={"government": govt.code, "location": loc.code})) 
    else: 
     context = {'form': form} 
     return render(request, 'appname/index.html', context) 

APPNAME /網址。PY 添加此網址

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

的index.html

<form method="post" action={% url 'appname:search' %}> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="Search" /> 
</form>