在 Django 的 url 路由中将列表作为参数传递
Passing list as a parameter in url routing in Django
我在 Django 中有一个业务模型,我需要在其中插入来自 API 的信息。但是,我想避免数据库中的重复项。因此,每当用户单击特定的 link 业务时,我需要检查它是否已存在于数据库中,如果不存在,我必须将其插入数据库并查看结果。以下代码是我到目前为止所做的。
def checkBusiness(request, business):
try:
result = Business.objects.get(checkId=business.checkId)
except Business.DoesNotExist:
b = Business(name=business[0]['name'], street_address=business[0]['location']['address'], city=business[0]['location']['city'], state=business[0]['location']['state'], country=business[0]['location']['country'], category=business[0]['categories']['name'], distance=business[0]['location']['distance'], checkId=business[0]['id'])
b.save()
result = Business.objects.get(checkId=checkId)
context = {
'business': result,
}
return render(request, "MyDiary/checkBusiness.html", context)
我的路线如下:
path('checkBusiness', views.checkBusiness, name='checkBusiness'),
这是我的 html:
{% for business in businesses %}
<li>
/*business is a json file for specific business detail*/
<a href="{% url 'checkBusiness' business %}" > {{ business.name }}, {{ business.location.address }}, {{ business.location.postalCode }} </a>
</li>
{% endfor %}
您不能在 URL 中传递对象。您应该明白,当您执行 {% url something %}
时,您只是在创建一个 url,即您在浏览器地址栏中看到的那个(path 部分准确)。 URL 路径不包含对象,它只是一些由 /
分隔的路径段,例如/businesses/
或 /businesses/49
或 businesses/49/employees/
。
一个URL可能在路径之后包含一个查询字符串,这是一个key/values的列表在 ?
之后,例如/businesses/?type=industrial&size=500
。在响应 URL /businesses/
的 Django 视图中,您会看到 request.GET
将具有 key/value 对 {"type": "industrial", "size": 500}
。要在模板中构建这样的 URL,您只需将参数附加到 URL 字符串:
"{% url 'business_list' %}?type={{ business.type }}&size={{ business.size }}"
urls.py只是路径的列表,它没有考虑查询字符串。如果您有路径 /businesses/
的视图,那么它将接受 any 查询字符串(同样,将在 request.GET
中)。
但是你应该永远不要在 GET 请求上写入数据库,所以像这样传递参数以在数据库中创建新记录是大禁忌。
您应该使用 POST 方法创建一个 <form method="post">
将信息提交给您的视图(在 request.POST
中),并在验证后您的视图在数据库中创建记录。它还可以检查记录是否已经存在。
(请注意,仅使用 checkId
进行检查并没有多大帮助,因为任何人都可以轻松更改 ID,以便相同的业务仍会在您的数据库中重复,只是使用不同的id.)
我在 Django 中有一个业务模型,我需要在其中插入来自 API 的信息。但是,我想避免数据库中的重复项。因此,每当用户单击特定的 link 业务时,我需要检查它是否已存在于数据库中,如果不存在,我必须将其插入数据库并查看结果。以下代码是我到目前为止所做的。
def checkBusiness(request, business):
try:
result = Business.objects.get(checkId=business.checkId)
except Business.DoesNotExist:
b = Business(name=business[0]['name'], street_address=business[0]['location']['address'], city=business[0]['location']['city'], state=business[0]['location']['state'], country=business[0]['location']['country'], category=business[0]['categories']['name'], distance=business[0]['location']['distance'], checkId=business[0]['id'])
b.save()
result = Business.objects.get(checkId=checkId)
context = {
'business': result,
}
return render(request, "MyDiary/checkBusiness.html", context)
我的路线如下:
path('checkBusiness', views.checkBusiness, name='checkBusiness'),
这是我的 html:
{% for business in businesses %}
<li>
/*business is a json file for specific business detail*/
<a href="{% url 'checkBusiness' business %}" > {{ business.name }}, {{ business.location.address }}, {{ business.location.postalCode }} </a>
</li>
{% endfor %}
您不能在 URL 中传递对象。您应该明白,当您执行 {% url something %}
时,您只是在创建一个 url,即您在浏览器地址栏中看到的那个(path 部分准确)。 URL 路径不包含对象,它只是一些由 /
分隔的路径段,例如/businesses/
或 /businesses/49
或 businesses/49/employees/
。
一个URL可能在路径之后包含一个查询字符串,这是一个key/values的列表在 ?
之后,例如/businesses/?type=industrial&size=500
。在响应 URL /businesses/
的 Django 视图中,您会看到 request.GET
将具有 key/value 对 {"type": "industrial", "size": 500}
。要在模板中构建这样的 URL,您只需将参数附加到 URL 字符串:
"{% url 'business_list' %}?type={{ business.type }}&size={{ business.size }}"
urls.py只是路径的列表,它没有考虑查询字符串。如果您有路径 /businesses/
的视图,那么它将接受 any 查询字符串(同样,将在 request.GET
中)。
但是你应该永远不要在 GET 请求上写入数据库,所以像这样传递参数以在数据库中创建新记录是大禁忌。
您应该使用 POST 方法创建一个 <form method="post">
将信息提交给您的视图(在 request.POST
中),并在验证后您的视图在数据库中创建记录。它还可以检查记录是否已经存在。
(请注意,仅使用 checkId
进行检查并没有多大帮助,因为任何人都可以轻松更改 ID,以便相同的业务仍会在您的数据库中重复,只是使用不同的id.)