Django使用pk_url_kwarg时出现invalid literal for int()错误求助
问题原因与解决方案
这个错误的根源很明确:你误用了pk_url_kwarg属性。
pk_url_kwarg是Django DetailView用来指定主键字段对应的URL参数名的,而主键默认是模型的id字段(整数类型)。当你把pk_url_kwarg设为program_code时,Django会尝试把URL传入的字符串'T0001'转换成整数,当作主键去查询,这自然会抛出invalid literal for int() with base 10的错误——因为字符串没法转成整数。
正确的做法:使用slug字段配置
因为program_code是一个唯一的字符串字段,你应该用slug_field和slug_url_kwarg来告诉DetailView通过这个字段查询对象:
修改你的views.py:
class ProgramDetailView(DetailView): model = Program template_name = 'submissions/program_details.html' slug_field = 'program_code' # 指定用来查询的字段名 slug_url_kwarg = 'program_code' # URL中对应的参数名(和slug_field同名时可省略)
额外建议:确保字段唯一性
为了避免查询时返回多个结果导致错误,建议给program_code字段添加唯一性约束,修改models.py:
program_code = models.CharField(max_length=5, unique=True)
这样修改后,DetailView就会正确地通过URL传入的program_code字符串去查询对应的Program对象,而不会再尝试转换成整数了。
内容的提问来源于stack exchange,提问作者DickyS
相关产品推荐
相关产品推荐

