请不要!
尝试使用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那样得到任何我可以做的事情,因此可能会影响结果。