【问题标题】:Django No Mini matches the given queryDjango No Mini 匹配给定的查询
【发布时间】:2013-06-03 22:55:07
【问题描述】:

我编写了一个链接缩短应用程序,它采用常规的长 url,并创建一个 10 个字符的字母数字字符串,用于 Django-1.5.1 的重定向。
生成的字符串中的重定向链接适用于:url(r'^(?P<short>\w+)/$', 'target'), 但由于某种原因,当我尝试访问其他两个视图时(一个用于创建新的短 url,另一个用于查看所有链接)我得到一个 404 页面,上面写着“没有 Mini 匹配给定的查询。”令人费解的是,当我使用url(r'^$', 'new_link'),url(r'^$', 'home'), 时一切正常

这是我的 urls.py 的内容:

from django.conf.urls import patterns, url

urlpatterns = patterns('mini_url.views',
    url(r'^(?P<short>\w+)/$', 'target'),
    url(r'^new_link/$', 'new_link'),
    url(r'^home/$', 'home'),
)

和views.py:

from django.shortcuts import render, get_object_or_404, redirect
from mini_url.models import Mini
from mini_url.forms import MiniForm
import string, random

def generate(N):
    characters = string.letters + string.digits
    random_list = [random.choice(characters) for _ in xrange(N)]
    return ''.join(random_list)

def new_link(request):
    if request.method == 'POST':
        form = MiniForm(request.POST)

        if form.is_valid():
            create = True
            link = form.save(commit=False)
            short_url = generate(10)
            link.short_url = short_url
            link.save()
            link_string = "http://localhost:8000/m/%s/" % short_url

    else:
        form = MiniForm()

    return render(request, 'mini_url/new_link.html', locals())


def target(request, short):
    short_link = get_object_or_404(Mini, short_url = short)
    short_link.counter += 1
    short_link.save()
    return redirect(short_link.long_url)

def home(request):
    links = Mini.objects.order_by('counter')
    return render(request, 'mini_url/home.html', {'links':links})

我该如何解决这个问题?

【问题讨论】:

  • 我可以通过将其映射到 urlpatterns 中的 r'^$' 来访问该页面以创建一个新 url,然后创建一个并将其添加到那里的数据库中工作正常:&gt;&gt;&gt; Mini.objects.get(short_url='8OA1Ys97rR') &lt;Mini: http://stackoverflow.com/questions/16987392/django-no-mini-matches-the-given-query&gt;,问题如果我想通过 r'^new_link/$' 是否无法访问该页面
  • 更改 URL 的顺序。它会正常工作

标签: python django url http-status-code-404


【解决方案1】:

问题在于您的 URL 模式。更改顺序,它会正常工作。

更改顺序为:

urlpatterns = patterns('mini_url.views',
    url(r'^new_link/$', 'new_link'),
    url(r'^home/$', 'home'),
    url(r'^(?P<short>\w+)/$', 'target'),
)

由于您的 url 模式匹配的正则表达式是 \w+,所以当您执行 /home/new_link

这里,URL 目标将首先匹配 url(r'^(?P&lt;short&gt;\w+)/$', 'target'),,并使用 new_linkhome 的参数调用视图 target。因此问题。

【讨论】:

    【解决方案2】:

    问题在于“new_link”和“home”都与 short_link 视图的定义相匹配,因此它们被解释为对该页面的调用。您应该将 short_link 移到底部,这样只有在其他人都不做时才会匹配。

    【讨论】:

      猜你喜欢
      • 2019-03-06
      • 2021-04-25
      • 2015-08-04
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 2013-09-22
      • 2011-08-19
      • 2021-05-07
      相关资源
      最近更新 更多