Django DetailView无法解决视图的问题

时间:2018-10-05 22:26:56

标签: python django

我已经写过这样的模型,视图和网址

models.py

class PreventionField(models.Model):
    name = models.SlugField(max_length=200)
    verbose_name = models.CharField(max_length=200)

views.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'])

urls.py

urlpatterns = [
    url(r'^$', Frontpage.as_view(), name='frontpage'),
    path('fields/<slug>/',PreventionFieldDetailView.as_view(),name='fields')]

我想要的是根据PreventionField模型中的条目生成条形网址,我可以在网站的子页面之间进行切换,例如

http://mywebsite.com/fields/neuro 来自模型的神经slugfield,但此返回错误

/ Fields / neuro /

处的FieldError

无法将关键字“子弹”解析为字段。选项包括:id,name,verbose_name

好,所以我必须从'slug'切换到'name',因为这是我在PreventionField模型中的SlugField,对吧?好吧,当我将views.py代码更改为

            return PreventionField.objects.get(slug=self.kwargs['name'])

然后出现以下错误:

/ Fields / neuro /

处的KeyError

“名称”

现在我已经丢失了。

我不明白为什么DetailView会以这种方式工作,以及如何更改它以获取条形网址。

PS

我应该提到的是,当我使用pk而不是时,我没有遇到任何问题。

1 个答案:

答案 0 :(得分:1)

这是错误的方法。模型中的字段称为name。所以:

return PreventionField.objects.get(name=self.kwargs['slug'])

虽然只在视图中的类级别设置slug_field = 'name'会好得多,那么您根本不需要定义get_object