我觉得我错过了一些简单的东西。我正在做一个小的个人项目,我有一个MongoDB,我正在通过Djongo连接到它。我已经开始制作一个前端,但在使用通用MongoDB对象ID的集合时遇到了问题。该视图将返回404,而在MongoDB中使用相同的查询将返回所需的文档。其他页面都很好,这是唯一使用对象ID字段的页面,因为它是一个仓促的后期添加
Model:
class Railway_Firmware(models.Model):
_id = models.ObjectIdField(name='_id', verbose_name='_id', db_column='_id', editable=False, max_length=200, primary_key=True)
qa = models.CharField(name='QA', verbose_name='QA', db_column='QA', max_length=200)
security = models.CharField(name='Security', verbose_name='Security', db_column='Security', max_length=200)
objects = models.Manager()
class Meta:
db_table = "Firmware"
verbose_name_plural = "firmware"
def get_absolute_url(self):
return reverse('firmware-detail-view', args=[self._id])
def __str__(self):
return str(self._id)
View:
class Railway_Firmware_DetailView(generic.DetailView):
model = Railway_Firmware
context_object_name = 'firmware'
template_name = 'firmware/firmware_detail.html'
pk_url_kwarg = '_id'
def get_queryset(self):
print({'_id': ObjectId(self.kwargs['_id'])})
return Railway_Firmware.objects.filter(**{'_id': ObjectId(self.kwargs['_id'])})
URL:
urlpatterns = [ path('firmware/<slug:_id>/', views.Railway_Firmware_DetailView.as_view(), name='firmware-detail-view'),
]
Admin与链接中相同的631b1ce580404ce3f61d4565的工作方式相同,例如:
/admin/web_dev/railway_firmware/631929cc0b15c01285ae87e1/change/
。
正在将查询打印到控制台:{‘_id’:ObjectID(‘631b1ce580404ce3f61d4565’)}这看起来是正确的,所以我不确定哪里出了问题。如有任何帮助,我们将不胜感激,谢谢!
1条答案
按热度按时间k5ifujac1#
在您的路由中,包含插件的
URLConf
关键字参数的名称为_id
。您已在
DetailView
中指定了pk_url_kwarg = '_id'
。因此,错误的过滤器应用于您的查询集,因为您的文档中没有pk
字段。在通过
get_object
方法为查询集构建筛选器时,需要通知DetailView
使用slug
字段。