首页 > 解决方案 > NoReverseMatch at / Reverse for 'snippet_detail' with arguments '('1534691562.8842607',)' not found

问题描述

我正在尝试在 django 应用程序中创建一个片段。

创建代码段时出现以下错误

NoReverseMatch at / 
Reverse for 'snippet_detail' with arguments '('1534693093.896782',)' not found. 1 pattern(s) tried: ['(?P<snippet_slug>[\\d]+)$']

我无法弄清楚这个问题。url 模式和视图中的所有内容看起来都不错。但是错误仍然存​​在。

django_project/urls.py

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

djangobin/urls.py

urlpatterns=[
    url(r'^$', views.index, name='index'),
    url('^(?P<snippet_slug>[\d]+)/$', views.snippet_detail, name='snippet_detail'),
]

djangobin/views.py

def index(request):
    if request.method=='POST':
        f=SnippetForm(request.POST)
        if f.is_valid():
            snippet=f.save(request)
            return redirect(reverse('djangobin:snippet_detail', args=[snippet.slug]))
    else:
        f=SnippetForm()
    return render(request, 'djangobin/index.html',{'form':f})

def snippet_detail(request, snippet_slug):
    snippet = get_object_or_404(Snippet, slug=snippet_slug)
    snippet.hits += 1
    snippet.save()
    return render(request, 'djangobin/snippet_detail.html', {'snippet': snippet})

这是片段模型:

class Snippet(models.Model):
    title=models.CharField(max_length=100, blank=True)
    original_code=models.TextField()
    highlighted_code=models.TextField(help_text='Contains syntax highlighted code - Read only')
    expiration=models.CharField(max_length=10, choices=Pref.expiration_choices)
    exposure=models.CharField(max_length=10, choices=Pref.exposure_choices)
    hits=models.IntegerField(default=0, help_text='Read only field. Will be updated after every visit to snippet.')
    slug=models.SlugField(help_text='Read only field. Will be filled automatically.')
    created_on=models.DateTimeField(auto_now_add=True)

    language=models.ForeignKey(Language, on_delete=models.CASCADE)
    user=models.ForeignKey(User, on_delete=models.CASCADE)
    tags=models.ManyToManyField('Tag', blank=True)

    def highlight(self):
        formatter=HtmlFormatter(linenos=True)
        return highlight(self.original_code, self.language.get_lexer(), formatter)

    def __str__(self):
        # return self.language
        return (self.title if self.title else "Untitled")+" - "+self.language.name

    def get_absolute_url(self):
        return reverse('djangobin:snippet_detail', args=[self.slug])

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug=str(time.time()).replace(",","")
        self.highlighted_code=self.highlight()
        if not self.title:
            self.title="Untitled"
        super(Snippet, self).save(*args, **kwargs)

    class Meta:
        ordering=['-created_on']

标签: djangodjango-modelsdjango-formsdjango-viewsurl-pattern

解决方案


您的 URL 模式只接受数字,但您的 slug 包含一个点。

您可以添加一个点:

url('^(?P<snippet_slug>[\d.]+)/$', 

尽管我不确定您为什么将时间戳用作 slug。


推荐阅读