Django 2.0 UpdateView NoReverseMatch

时间:2018-01-22 05:11:17

标签: python django

请不要!

尝试使用UpdateView更新名称为"标记"

的模型对象

以下是模型:

NAME_REGEX = r'^[a-zA-Z0-9\s.\-]+$'

class Tag(TimeStampModel):
    name = models.CharField(max_length=40,
      validators = [
        RegexValidator(regex=NAME_REGEX,
          message='name must be alphanumeric, may contain - _',
          code='invalid tag name')],
      unique=True)
    slug = models.SlugField(max_length=60, unique=True, blank=True)
    text = models.TextField(blank=True)
    def __str__(self):
        return self.name

    def get_absolute_url(self):
        url = reverse('tags:tag_detail', kwargs={'slug':self.slug})
        print('Tag *************** 010 ********************')
        print(url)
        return url

    def save(self, *args, **kwargs):
        self.slug = make_slug(self.name)
        super().save()

我可以使用CreateView创建标签,使用ListView列出标签并使用DetailView访问标签详细信息。我也可以使用基于函数的视图编辑标签。但是,它会因UpdateView而崩溃。

以下是网址:

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('tag_list/', views.TagListView.as_view(), name='tag_list'),
    path('tag_detail/<slug:slug>/', views.TagDetailView.as_view(), 
    name='tag_detail'),
    path('create_tag/', views.CreateTagView.as_view(),
    name = 'create_tag'),
    path('update_tag/<slug:slug>/', views.UpdateTagView.as_view(),
    name = 'update_tag'),
    path('category_list/', views.CategoryListView.as_view(),
    name = 'category_list'),
    path('category_detail/<slug>/', views.CategoryDetailView.as_view(),
    name = 'category_detail'),
]

在名为&#34; tag_detail.html&#34;的模板中我提供了一个链接,应该将用户带到编辑表单,如下所示:

<p class="slm-red">
  {{ tag_dict.slug }}
  <br>
  <a href="{% url 'tags:update_tag' tag_dict.slug %}">Edit Tag</a>
</p>

(我已经在链接之前打印了slug的值。这不是问题。slug值是正确的。在这种情况下slug =&#34; brown&#34;)

当我点击链接时,它会将我带到:

http://localhost:8000/tags/update_tag/brown/

在这种情况下,slug的值为&#34; brown&#34;

我收到以下错误消息:

Reverse for 'update_tag' with no arguments not found. 1 pattern(s) tried: ['tags\\/update_tag\\/(?P<slug>[-a-zA-Z0-9_]+)\\/$']

我用老式的方式尝试使用&#34; url&#34;而不是路径和具有相同结果的slug的正则表达式。

当我使用基于函数的视图传递slug作为参数时,一切正常。

这是UpdateTagView:

class UpdateTagView(UpdateView):
    print('UpdateTagView  **************  010 *****************')
    template_name = 'tags/update_tag.html'
    model = Tag
    fields = ['text']

第一行是print语句。它没有出现在控制台日志中,因此这确认Django永远不会达到实际视图。我在控制台日志中获得的内容包括以下内容:

[22/Jan/2018 16:06:00] "GET /tags/tag_detail/brown/ HTTP/1.1" 200 4852
Internal Server Error: /tags/update_tag/brown/

我尝试了几种变体,但没有任何效果。我非常绝望。

我在Django的早期版本中看到了关于堆栈溢出的类似问题,但似乎从未有过答案。

当我使用FBV时,它很简单。我只是将slug作为参数和请求一起传递。

值得注意的是,base.py中似乎发生了错误。在错误消息的末尾,我看到:

C:\django\_dj\projenv\lib\site-packages\django\urls\base.py in reverse

我认为我应该覆盖一个小矮人,但我不知道如何做到这一点。由于Django从未像UpdateTagView那样得到任何我可以做的事情,因此可能会影响结果。

0 个答案:

没有答案