Django自定义主键字段在URL中使用报错问题求助
解决Django自定义主键在DetailView中的错误问题
这个问题我之前也碰到过,本质是Django的通用DetailView默认只认pk或者slug这两个URL参数名,而你的主键是自定义的school_pk,所以视图不知道该用哪个参数去数据库查询对象。给你几个靠谱的解决方案:
方案1:修改URL参数名为pk(最简单)
不用修改视图代码,只需要把URL配置里的参数名改成pk,Django会自动用这个值匹配模型的自定义主键字段:
# urls.py from django.urls import path from .views import SchoolDetailView urlpatterns = [ # 把原来的school_pk改成pk path('schools/<int:pk>/', SchoolDetailView.as_view(), name='school-detail'), ]
这种方法最省事,因为模型的主键是school_pk,Django在查询时会自动用pk参数的值去匹配主键字段。
方案2:在视图中指定pk_url_kwarg属性
如果不想改URL的参数名,直接在SchoolDetailView里告诉Django要用哪个URL参数作为主键:
# views.py from django.views.generic.detail import DetailView from .models import School class SchoolDetailView(DetailView): model = School # 指定URL中的参数名是school_pk pk_url_kwarg = 'school_pk' # 可选:指定模板中使用的上下文变量名,比如改成school context_object_name = 'school'
对应的URL配置保持不变即可:
path('schools/<int:school_pk>/', SchoolDetailView.as_view(), name='school-detail'),
方案3:重写get_object方法(自定义逻辑)
如果需要更灵活的查询逻辑,可以手动重写get_object方法,自己从URL参数中获取school_pk并查询对象:
# views.py class SchoolDetailView(DetailView): model = School def get_object(self, queryset=None): if queryset is None: queryset = self.get_queryset() # 从URL参数中获取school_pk school_pk = self.kwargs.get('school_pk') # 用自定义主键查询对象 return queryset.get(school_pk=school_pk)
额外检查:模型的get_absolute_url
如果你的模型里定义了get_absolute_url,要确保它传递的参数名和URL配置一致:
# models.py from django.db import models from django.urls import reverse class School(models.Model): school_pk = models.AutoField(primary_key=True) name = models.CharField(max_length=100) def get_absolute_url(self): # 这里的kwargs要和URL里的参数名对应 return reverse('school-detail', kwargs={'school_pk': self.school_pk})
以上三种方法任选其一都能解决问题,推荐方案1或者方案2,足够应对大部分场景。
内容的提问来源于stack exchange,提问作者WISAM
相关产品推荐
相关产品推荐

