我有一个包含两个下拉列表的 HTML 帖子,我想将这些列表中选定的 Country
发送到 views 中的
,然后将我发送到 search()
方法。 py结果
View 。每当我添加 government
和 location
作为 html POST 操作的参数或在搜索正则表达式中添加它们的值时,我尝试这样做,我得到一个 NoReverseMatch
从我的 index
页面:
Reverse for 'search' with arguments '('', '')' and keyword arguments '{}' not found. 1 pattern(s) tried: ['search/(?P[A-Z]{3})/(?P[A-Z]{3})/']
我不知道我做错了什么导致了这个错误。 (见代码中的注释)
应用程序名称/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,)))
应用程序名称/模板/应用程序名称/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>
url.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),
]
应用程序名称/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'),
]
应用程序名称/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'
最佳答案
事情不是这样的。 url 标记的参数(实际上与任何模板标记一样)必须来自渲染时传递给模板的上下文。但是您正在尝试动态使用表单本身的值。
您应该从 URL 模式中完全删除参数。无论如何,您都没有在 View 中使用它们,因为您从 request.POST 正确获取了值。
url(r'^search/$', views.search, name='search'),
...
<form action="{% url 'search' %}" ...
关于python - Django HTML POST 参数导致NoReverseMatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41394570/