在 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/49businesses/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.)