python - Django HTML POST 参数导致NoReverseMatch

标签 python html django post

我有一个包含两个下拉列表的 HTML 帖子,我想将这些列表中选定的 Country 发送到 views 中的 search() 方法。 py ,然后将我发送到 结果 View 。每当我添加 governmentlocation 作为 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/

相关文章:

python - 没有足够的值来解包(预期 3,得到 1)

html - 伪选择器 :last-child not working

python - 如何更改 Django 中外键的 db_column 名称?

jquery - django-debug-toolbar 无法在 Django 网站中使用 jQuery

python - 在 Mac 上使用 pip 安装 nltk 时出现不支持的架构错误

python - 使用 sed [无重复] 删除两个行号(或模式)之间的行

Javascript 去除背景颜色和不透明度

javascript - 为什么我不能使用此 AJAX 响应的一部分?

python - 完整性错误 : column slug is not unique

python - 使用 Keras 进行数据增强