我曾经这样写过模型、 View 和url
模型.py
class PreventionField(models.Model):
name = models.SlugField(max_length=200)
verbose_name = models.CharField(max_length=200)
View .py
class PreventionFieldDetailView(DetailView):
model = PreventionField
template_name = 'prevention-fields-details.html'
template_name = "prevention-field-details.html"
def get_object(self, **kwargs):
return PreventionField.objects.get(slug=self.kwargs['slug'])
网址.py
urlpatterns = [
url(r'^$', Frontpage.as_view(), name='frontpage'),
path('fields/<slug>/',PreventionFieldDetailView.as_view(),name='fields')]
我想要的是根据 PreventionField 模型中的条目生成 slug url,我可以在我的网站的子页面之间切换,比如
http://mywebsite.com/fields/neuro 来自模型的 neuro slugfield,但是返回错误
/fields/neuro/处的 FieldError
无法将关键字“slug”解析为字段。选项有:id、name、verbose_name
好的,所以我必须从“slug”切换到“name”,因为这是模型 PreventionField 中的 SlugField,对吗?好吧,当我将 views.py 代码更改为
return PreventionField.objects.get(slug=self.kwargs['name'])
然后出现如下错误:
/fields/neuro/处的 KeyError
'姓名'
现在我失去了它。
我不明白为什么 DetailView 以这种方式工作以及我应该如何更改它以获得 slug url。
附言
我应该提一下,当我使用 pk 而不是 slug 时,我没有遇到任何问题。
请您参考如下方法:
你理解错了。模型中的字段称为 name。所以:
return PreventionField.objects.get(name=self.kwargs['slug'])
如果只在 View 的类级别设置 slug_field = 'name' 会好得多,那么您根本不需要定义 get_object。
