Skip to main content
 首页 » 编程设计

python之Django DetailView 无法解析 View 的 slug

2024年09月07日3898°冷暖

我曾经这样写过模型、 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。