我使用 DjangoDetailView
在我的 Web 应用中显示详细信息。我设置了一个Processor
带有name
和slug
字段的模型,并在 URL 模式和 DetailView 中使用该字段。但是,我遇到了一个问题,如果 URL 段的大小写与数据库中的字段不完全匹配,slug
DetailView 就无法找到该对象。Processor
slug
例如如果我访问localhost:8000/detail/paypal
我会得到以下错误:
Using the URLconf ... Django tried these URL patterns, in this order:
...
detail/<slug:slug> [name='processor_detail']
The current path, detail/PayPal, matched the last one.
此外,我在 url 字段中输入的 url 更改为localhost:8000/detail/PayPal
,并将字母大写。
最后,只有当我首先通过单击来自另一个页面的链接访问该网址时,该网址才有效。此后,无论我是否进入隐身模式,也无论我在 slug 中使用了什么大写字母,它都可以正常工作。但是,如果我进入隐身模式并直接访问该网址(即,在没有通过单击来自另一个页面的链接访问该网址之后),无论我是否将 slug 大写,它都根本无法加载。我希望你能理解我的观点。
这是我的代码:
views.py
:
class ProcessorDetailView(DetailView):
model = Processor
template_name = 'finder/processor_detail.html'
slug_field = 'slug' # Tell DetailView to use the `slug` model field as the DetailView slug
slug_url_kwarg = 'slug' # Match the URL parameter name
models.py
:
class Processor(models.Model): #the newly created database model and below are the fields
name = models.CharField(max_length=250, blank=True, null=True) #textField used for larger strings, CharField, smaller
slug = models.SlugField(max_length=250, blank=True)
...
def __str__(self): #displays some of the template information instead of 'Processot object'
if self.name:
return self.name[0:20]
else:
return '--no processor name listed--'
def get_absolute_url(self): # new
return reverse("processor_detail", args=[str(self.name)])
def save(self, *args, **kwargs): #`save` model a certain way(detailed in rest of function below)
if not self.slug: #if there is no value in `slug` field then...
self.slug = slugify(self.name) #...save a slugified `name` field value as the value in `slug` field
super().save(*args, **kwargs)
urls.py
:
path("detail/<slug:slug>", views.ProcessorDetailView.as_view(), name='processor_detail')
<a href="{%url 'processor_detail' processor.slug%}" class="details-link"> Details → </a>
例如,如果我使用 在单独的模板上点击链接到有问题的网址,它之后就可以正常工作。
当你使用 url 时,django 会使用你的模型
get_absolute_url
来检索正确的对象,并返回字段name
。但你要求你的视图使用,slug
所以它会中断。只需在你的视图中返回 slugget_absolute_url
,它就可以工作