我有两个main usage
和main model
页面,其中列出了特定用途或型号的产品。我对这些页面有以下视图:
def get_common_queryset():
usage_queryset = Usage.objects.all()
sub_usage_queryset = SubUsage.objects.all()
main_model_queryset = MainModel.objects.all()
pump_type_queryset = PumpType.objects.all()
queryset_dictionary = {
"usage_queryset": usage_queryset,
"sub_usage_queryset": sub_usage_queryset,
"main_model_queryset": main_model_queryset,
"pump_type_queryset": pump_type_queryset,
}
return queryset_dictionary
def products_usage_main(request):
queryset_dictionary = get_common_queryset()
context = queryset_dictionary
return render(request, "products/products_usage_main.html", context)
def products_model_main(request):
queryset_dictionary = get_common_queryset()
context = queryset_dictionary
return render(request, "products/products_model_main.html", context)
这里我们有一个get_common_queryset()
函数,你可以在这个问题中读到它的原因。然后我们有两个类似的视图函数,products_usage_main
和product_model_main
,但具有不同的模板。
在urls.py
中,我有以下这些视图的路径:
urlpatterns = [
path("application/", products_usage_main, name="products_usage_main"),
path("model/", products_model_main, name="products_model_main"),
]
在这里,我们可以再次看到两条路径是相似的,只是不同的视图。
最后,这两个视图有两个单独的模板,它们的代码不需要或与我所面临的问题相关。
问题:
在我的产品页面侧边栏中,我有两个主要链接引用/products/application/
和/products/model/
,当我点击/products/application/
时,一切都很好;但是当点击/products/model/
时,我得到以下错误:
ValidationError at /products/model/
['“model” is not a valid UUID.']
当我查看traceback错误时,它说问题来自product_detail
视图和product = Product.objects.get(id=pk)
行,这与这两个页面及其视图无关!下面是我的product_detail
视图:
def product_detail(request, pk):
product = Product.objects.get(id=pk)
head_flow_dataset = HeadFlowDataSet.objects.filter(
product=product
).order_by("flow")
context_of_view = {
"product": product,
"head_flow_dataset_x": [],
"head_flow_dataset_y": [],
}
for head_flow in head_flow_dataset:
context_of_view["head_flow_dataset_x"].append(head_flow.flow)
context_of_view["head_flow_dataset_y"].append(head_flow.head)
queryset_dictionary = get_common_queryset()
context = {
**context_of_view,
**queryset_dictionary,
}
return render(request, "products/product_detail.html", context)
下面我将发送完整的错误回溯,以防您需要它:
Internal Server Error: /products/model/
Traceback (most recent call last):
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangodbmodelsfields__init__.py", line 2649, in to_python
return uuid.UUID(**{input_form: value})
File "C:UsersVahid MoradiAppDataLocalProgramsPythonPython310libuuid.py", line 177, in __init__
raise ValueError('badly formed hexadecimal UUID string')
ValueError: badly formed hexadecimal UUID string
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangocorehandlersexception.py", line 55, in inner
response = get_response(request)
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangocorehandlersbase.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.comproductsviews.py", line 152, in product_detail
product = Product.objects.get(id=pk)
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangodbmodelsmanager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangodbmodelsquery.py", line 636, in get
clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs)
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangodbmodelsquery.py", line 1420, in filter
return self._filter_or_exclude(False, args, kwargs)
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangodbmodelsquery.py", line 1438, in _filter_or_exclude
clone._filter_or_exclude_inplace(negate, args, kwargs)
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangodbmodelsquery.py", line 1445, in _filter_or_exclude_inplace
self._query.add_q(Q(*args, **kwargs))
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangodbmodelssqlquery.py", line 1532, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangodbmodelssqlquery.py", line 1562, in _add_q
child_clause, needed_inner = self.build_filter(
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangodbmodelssqlquery.py", line 1478, in build_filter
condition = self.build_lookup(lookups, col, value)
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangodbmodelssqlquery.py", line 1303, in build_lookup
lookup = lookup_class(lhs, rhs)
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangodbmodelslookups.py", line 27, in __init__
self.rhs = self.get_prep_lookup()
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangodbmodelslookups.py", line 341, in get_prep_lookup
return super().get_prep_lookup()
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangodbmodelslookups.py", line 85, in get_prep_lookup
return self.lhs.output_field.get_prep_value(self.rhs)
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangodbmodelsfields__init__.py", line 2633, in get_prep_value
return self.to_python(value)
File "D:ProjectsNavid MotorWebsiteDjangoNavidMotor.com.venvlibsite-packagesdjangodbmodelsfields__init__.py", line 2651, in to_python
raise exceptions.ValidationError(
django.core.exceptions.ValidationError: ['“model” is not a valid UUID.']
[12/Dec/2022 11:22:53] "GET /products/model/ HTTP/1.1" 500 145337
为了解决这个问题,我回顾了我的其他视图,特别是product_detail
视图,我试图理解为什么这个视图应该是这个问题的根源。
在我的products/urls.py
中,我有一个product_detail
视图的路径,如下所示:
path("<str:pk>/", product_detail, name="product_detail"),
另一方面,model page
url,如上所述,如下:
path("model/", products_model_main, name="products_model_main"),
所以我猜这两个路径之间的相似之处是问题的根源,当我将product_detal
的路径url更改为path("product-detail/<str:pk>/
时,两个页面都工作得很好。
更新:我找到了另一个解决方案,也是这个问题的主要原因。在如上所述更改product_detail
路径后,它让我思考这个问题的原因,因为除了products/model/
之外,我还有另一个具有此结构的urlproducts/application/
;那么,为什么这个问题只发生在model
页?然后我彻底检查了我的urls.py
文件,这是products.urls
中的完整路径:
path("application/", products_usage_main, name="products_usage_main"),
path("<str:pk>/", product_detail, name="product_detail"),
path(
"application/single-application/<str:pk>",
products_single_usage_list,
name="products_single_usage_list",
),
path("model/", products_model_main, name="products_model_main"),
path(
"application/single-application/sub-application/<str:pk>",
products_sub_usage_list,
name="products_sub_usage_list",
),
path(
"model/single-model/<str:pk>",
products_single_model_list,
name="products_single_model_list",
),
path(
"model/single-model/pump-type/<str:pk>",
products_single_type_list,
name="products_single_type_list",
),
]
可以看到url的顺序,第一个url是products/application/
,第二个是products/<str:pk>
;我认为Django是按照这个顺序检查url的,它期望products/model/
中的model
是第二个url中的<str:pk>
部分。所以,我改变了url的顺序,它只是工作得很好,而不需要改变product_detail
页面的url。
最终urls.py
代码:
urlpatterns = [
path("application/", products_usage_main, name="products_usage_main"),
path("model/", products_model_main, name="products_model_main"),
path("<str:pk>/", product_detail, name="product_detail"),
path(
"application/single-application/<str:pk>",
products_single_usage_list,
name="products_single_usage_list",
),
path(
"application/single-application/sub-application/<str:pk>",
products_sub_usage_list,
name="products_sub_usage_list",
),
path(
"model/single-model/<str:pk>",
products_single_model_list,
name="products_single_model_list",
),
path(
"model/single-model/pump-type/<str:pk>",
products_single_type_list,
name="products_single_type_list",
),
]
我希望这个答案对其他可能遇到类似问题的人有帮助。