【问题标题】:django url without pk没有pk的django url
【发布时间】:2018-07-17 23:33:39
【问题描述】:

我现在尝试让我的网址与我的简单模型和视图一起工作太久了。有些东西我肯定不明白。

我希望创建一个类似于: .../department/team, 我不使用部门对象的PK,而是使用名称。

我的模型看起来像:

class Department(models.Model):
    name = models.CharField(max_length=50, blank=True, null=True)
    def __str__(self):
        return 'Department: ' + self.name

class Hold(models.Model):
    name = models.CharField(max_length=50, blank=True, null=True)
    department = models.ForeignKey(Department, on_delete=models.CASCADE)

我的视图看起来像(已更新):

class IndexView(generic.ListView):
   template_name = 'index.html'
   context_object_name = 'departments_list'

   def get_queryset(self):
       return Department.objects.all()

class DepartmentView(generic.DetailView):
    model = Department
    template_name="depdetail.html"
    slug_field = "name"
    slug_url_kwarg = "name"

我的网址如下所示:已更新

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('<name>', views.DepartmentView.as_view(), name='depdetail')
 ]

最后是我的 html:

<h1> Hello there {{ object.name }} student</h1> </br>
<b> Choose your team:<b> </br>

但是我不断收到page not foundmust be slug or pk.. 我希望有人可以帮助我,这样我就可以解决这个问题。

更新 现在可以了:)谢谢您的回复。

【问题讨论】:

    标签: python django url


    【解决方案1】:

    默认情况下,当您使用DetailView 时,Django 将查找pkslug 字段。您必须重写 get_object() 方法才能更改此行为:

    get_object() 在视图的参数中查找pk_url_kwarg 参数;如果找到此参数,则此方法使用该值执行基于主键的查找。如果未找到此参数,它会查找 slug_url_kwarg 参数,并使用 slug_field 执行 slug 查找。

    话虽如此,您的方法还有其他问题。出于其他原因,使用 slug 而不是名称总是更好。例如,name 不能保证是唯一的,并且它可能包含不安全的 URL 字符。有关如何使用 slug 字段的详细讨论,请参阅 this question

    【讨论】:

      猜你喜欢
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 2018-05-18
      • 2014-07-12
      • 2018-09-17
      相关资源
      最近更新 更多