【问题标题】:How to solve strange URL ERROR in Django?如何解决 Django 中奇怪的 URL ERROR?
【发布时间】:2018-05-12 02:46:18
【问题描述】:

我有这样的表格..

{% extends 'DATAPLO/base.html' %}
{% load staticfiles %}
{% block content %}


<form action="/cholera/SeqData/result_page/" method="post">


    <div style=" color: #1f5a09; margin: auto; margin-top: 10px; height: 15%; border: 1px solid green; box-sizing: border-box;background: #9fc36a; width: 100%">
    <div style= "margin-left:  15px;">
    <p style="color: #000000 "; > <b>Enter year range to explore seqence data country wise</b> </p>
    </div>
    {% csrf_token %}
    <div style= "margin-left:  5px; margin-right: 50px;margin-top: 2px">
    <b>Start year:</b> 
    {{ form.start_year }} 
    </div>
    <div style= "margin-left:  13px; margin-right: 54px;margin-top: 2px">
    <b> End year:</b> 
    {{form.end_year }}  
    </div>
    <div style= "margin-left:  17px; margin-right: 50px;margin-top: 2px">
    <b>Country:</b> 
    {{form.country }} 
    </div>
    <div style= "margin-left:  75.5px; margin-right: 50px;margin-top: 5px">
    <input type="submit" value="Submit"/>
    </div>

</div>
</form>

{% endblock %}

这样的观点..

def input_form(request):

    if request.method == 'POST':

        form = InForm(request.POST)
    else:
        form = InForm()

    return render(request, 'SeqData/in_form.html', {'form': form})


def result_page(request):

    form = InForm(request.POST)

    if form.is_valid():

        val1 = form.cleaned_data['start_year']
        val2 = form.cleaned_data['end_year']
        val3 = form.cleaned_data['country']

        if val1 <= val2:
            IDs = SequenceDetails.objects.all().filter(country=val3).filter(year__range =[val1,val2])
            return render(request,'SeqData/slider.html',{'IDs':IDs})

        else:
            return render(request,'SeqData/ERROR.html',{'val1':val1, 'val2':val2})

像这样的项目 URL.py..

urlpatterns = [

    url(r'^cholera/', include('table.urls'), name='cholera'),
    url(r'^cholera/', include('DATAPLO.urls')),
    url(r'^cholera/', include('SeqData.urls')),
]

Application URL.py 像这样..

from django.conf.urls import url
from . import views

urlpatterns = [

url(r'^SeqData/$', views.input_form, name='input_form'),
url(r'', views.result_page, name='result_page'),

]

当我在本地服务器上运行此代码并以表单形式提交年份范围(例如 2001 至 2016 年和下拉示例“印度”中的国家/地区名称)时,此代码运行得非常好,当我单击提交按钮时返回相关数据,它成功返回如下所示的 url 和数据表。

127.0.0.1:8000/cholera/SeqData/result_page

当我将此代码传输到我的 VPS 并在 apache2 服务器上运行时,一切都很好,除了提交按钮返回一个如下所示的 url(显示的 IP 是一个虚拟的)。和如下所示的错误页面。

92.166.167.63/cholera/SeqData/result_page 

错误页面..

Page not found (404)
Request Method: POST
Request URL:    http://93.188.167.63/cholera/SeqData/result_page/
Using the URLconf defined in trytable.urls, Django tried these URL patterns, in this order:
^cholera/ ^$ [name='table_list']
^cholera/ ^contact/$ [name='contact']
^cholera/ ^about/$ [name='about']
^cholera/ ^database/$ [name='database']
^cholera/ ^DATAPLO/$ [name='Country_name_list']
^cholera/ ^DATAPLO/(?P<pk>\d+)/$ [name='County_Details']
^cholera/ ^fasta/$ [name='fasta_list']
^cholera/ ^fasta/(?P<pk>\d+)/$ [name='fasta_detail']
^cholera/ ^test_m/$ [name='Student_list']
^cholera/ ^test_m/(?P<pk>\d)/$ [name='Student_info']
^cholera/ ^SeqData/$ [name='input_form']
^cholera/ ^SeqData/$ [name='result']
^cholera/ ^upload_vew/ [name='upload_vew']
^cholera/ ^DataUpload/ [name='DataUpload']
The current URL, cholera/SeqData/result_page/, didn't match any of these.

我该如何解决这个奇怪的问题,请帮助.. 谢谢

更新 我有这样的更改表单操作..

<form action="{% url 'seqdata:result_page' %}" method="post">

和这样的项目 urls.py..

url(r'^cholera/', include('table.urls'), name='cholera'),
url(r'^cholera/', include('DATAPLO.urls')),
url(r'^cholera/', include('SeqData.urls'), namespace='seqdata')

显示错误..

NoReverseMatch at /cholera/SeqData/
u'seqdata' is not a registered namespace

连表格都打不开..

【问题讨论】:

  • 为什么要硬编码网址?
  • 这里没有奇怪的错误,你想去哪个网址?和目前cholera/的一样吗?
  • 当我点击提交按钮时,它返回数据表并在本地服务器上返回这个 url “127.0.0.1:8000/cholera/SeqData/result_page” 但是当我将它传输到 Apchache 它返回这个 url下面给出的错误..“92.166.167.63/cholera/SeqData/result_page”
  • @mohammedqudah 兄弟清楚你想问什么.. 我无法理解编码语言,因为过去 4 个小时试图解决这个问题并且已经失去了一半的神经元 :( :|
  • 硬编码网址意味着这样做/bla/bla/而不是{% url 'url-name' %}你误解了我:)

标签: python django django-forms django-urls


【解决方案1】:

这是来自表单操作的网址:

/cholera/SeqData/result_page/

这是来自 urls.py 的网址

url(r'^cholera/', include('SeqData.urls')),
url(r'^$', views.result_page, name='result_page'),

翻译成

/cholera/

如您所见,/cholera/SeqData/result_page/ 不在您的urls.py 中。

按照@mohammed-qudah 的建议或更好的方法,将表单的 action 属性中定义的 url 更改为 {% url 'result_page' %},或者更好地为 SeqData 定义命名空间,并使用如下命名空间定义 url:

 url(r'^cholera/', include('SeqData.urls', namespace='seqdata'))

动作属性中的url为{% url 'seqdata:result_page' %}

总体而言,您在那里所做的设计有点糟糕。 if in input_form() 没有做任何事情,您应该考虑将这两个函数合并为一个,如下所示:

def input_form(request):

    if request.method == 'POST':
        form = InForm(request.POST)
        if form.is_valid():
            val1 = form.cleaned_data['start_year']
            val2 = form.cleaned_data['end_year']
            val3 = form.cleaned_data['country']
            if val1 <= val2:
                IDs = SequenceDetails.objects.filter(country=val3).filter(year__range =[val1,val2])
                return render(request,'SeqData/slider.html',{'IDs':IDs})
            else:
                return render(request,'SeqData/ERROR.html',{'val1':val1, 'val2':val2})
    else:
        form = InForm()

    return render(request, 'SeqData/in_form.html', {'form': form})

...并从表单中删除属性操作(action="/cholera/SeqData/result_page/")。

这可以通过将val1 &lt;= val2 移动到表单验证来进一步改进,这样表单将不会验证val1 &lt;= val2。 Django 文档的相关部分在子章节Cleaning and validating fields that depend on each other 中。你的InForm 应该看起来像这样:

class InForm(forms.ModelForm):
    # Everything as before.
    ...

    def clean(self):
        cleaned_data = super().clean()
        val1 = cleaned_data.get("val1")
        val2 = cleaned_data.get("val2")

        if val1 <= val2:
            raise forms.ValidationError("... this is an error message ...")

您可以通过调用{{ form.non_field_errors }} 在表单中显示此错误消息。您可以查看文档Rendering form error messages 了解更多信息。调整后的input_form() 会是这样的:

def input_form(request):

    if request.method == 'POST':
        form = InForm(request.POST)
        if form.is_valid():
            val1 = form.cleaned_data['start_year']
            val2 = form.cleaned_data['end_year']
            val3 = form.cleaned_data['country']
            IDs = SequenceDetails.objects.filter(country=val3).filter(year__range =[val1,val2])
            return render(request,'SeqData/slider.html',{'IDs':IDs})
        else:
            print(form.errors)
    else:
        form = InForm()

    return render(request, 'SeqData/in_form.html', {'form': form})

【讨论】:

  • 我只是在尝试这个......一个查询......为什么这段代码可以与本地服务器一起使用。
  • 我对你的回答的理解,我在问题中有更新,它仍然无法正常工作。
  • 抱歉,网址有误。应该是这样的:url(r'^cholera/', include('SeqData.urls', namespace='seqdata'))
  • 同样的错误“u'seqdata'不是注册的命名空间”
  • 您是否重新启动了 apache 或您正在使用的任何服务器?
【解决方案2】:

绞尽脑汁终于找到答案了..

像这样更改网址..

from django.conf.urls import url
from . import views

urlpatterns = [

url(r'^SeqData/$', views.input_form, name='input_form'),
url(r'^SeqData/result_page$', views.result_page, name='result_page'),

]

并根据 @Borut 的建议,我在 form.html 中这样做了

<form action="{% url result_page%}" method="post">

最重要的是重新启动 apache2 以加载和实施更改..

它对我有用..

谢谢

【讨论】:

    猜你喜欢
    • 2013-10-21
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多