巨蟒 Django :从modal获取数据时出现〈built-in function id>错误

rn0zuynd  于 2022-11-18  发布在  Go
关注(0)|答案(1)|浏览(365)

我尝试从一个modal中获取一个值,该modal使用jQuery从列表中获取值。
让我们来解释一下。
我在一个HTML页面中使用for循环创建了一个对象列表,每行都有一个删除按钮。
此删除按钮启动确认模式。
为了获取行的id并在Modal中使用它,我使用jQuery:

{% for a in objects %}
[...]
<td><button type="button" class="delete-button" data-name="{{ a.id }}" data-bs-toggle="modal" data-bs-target="#deleteModal">Delete</button></td>
[...]
{% endfor %}

[...]

<div class="modal fade" id="deleteModal">
[...]
<form action="{% url 'delete_object' %}" method="post">
{% csrf_token %}
<input type="hidden" name="object_id" name="object_field" />
<button type="submit">Delete</button>
[...]

<script>
    $('.delete-button').click(function() {
        $('#object_id').html($(this).data('name'))
    })
</script>

不解释urls.py部分,让我们直接进入视图,它非常简单:

def cancel_request(request):
    _id = request.POST.get("object_id")
    obj = Object.objects.get(id=id)
    obj.status = "Annulé"
    obj.save()
    return redirect("home")

当我运行modal的时候,我确保我能看到id值进入modal,但是当我试图把它放在input中的时候,我就看不到了。如果我把它放在h5标签中,比如:<h5 class="modal-title" id="request_id" name="requestid_kw"></h5>,它显示在模态上,但仍然没有传递到视图。当我执行按钮时,我得到以下错误:

TypeError at /cr
Field 'id' expected a number but got <built-in function id>.

下面是完整的回溯:

Environment:

Request Method: POST
Request URL: http://localhost:8000/cr

Django Version: 4.1.3
Python Version: 3.10.7
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'main.apps.MainConfig',
 'api.apps.ApiConfig',
 'import_export',
 'storages']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Traceback (most recent call last):

  File "D:\#######\v1proj\v1env\lib\site-packages\django\db\models\fields\__init__.py", line 2018, in get_prep_value
    return int(value)

The above exception (int() argument must be a string, a bytes-like object or a real number, not 'builtin_function_or_method') was the direct cause of the following exception:
  File "D:\#######\v1proj\v1env\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
  File "D:\#######\v1proj\v1env\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\#######\v1proj\v1env\lib\site-packages\sentry_sdk\integrations\django\views.py", line 68, in sentry_wrapped_callback
    return callback(request, *args, **kwargs)
  File "D:\#######\v1proj\paylik-v1\main\views.py", line 443, in cancel_request
    avance = Advance.objects.get(id=id)
  File "D:\#######\v1proj\v1env\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "D:\#######\v1proj\v1env\lib\site-packages\django\db\models\query.py", line 636, in get
    clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs)
  File "D:\#######\v1proj\v1env\lib\site-packages\django\db\models\query.py", line 1420, in filter
    return self._filter_or_exclude(False, args, kwargs)
  File "D:\#######\v1proj\v1env\lib\site-packages\django\db\models\query.py", line 1438, in _filter_or_exclude
    clone._filter_or_exclude_inplace(negate, args, kwargs)
  File "D:\#######\v1proj\v1env\lib\site-packages\django\db\models\query.py", line 1445, in _filter_or_exclude_inplace
    self._query.add_q(Q(*args, **kwargs))
  File "D:\#######\v1proj\v1env\lib\site-packages\django\db\models\sql\query.py", line 1532, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "D:\#######\v1proj\v1env\lib\site-packages\django\db\models\sql\query.py", line 1562, in _add_q
    child_clause, needed_inner = self.build_filter(
  File "D:\#######\v1proj\v1env\lib\site-packages\django\db\models\sql\query.py", line 1478, in build_filter
    condition = self.build_lookup(lookups, col, value)
  File "D:\#######\v1proj\v1env\lib\site-packages\django\db\models\sql\query.py", line 1303, in build_lookup
    lookup = lookup_class(lhs, rhs)
  File "D:\#######\v1proj\v1env\lib\site-packages\django\db\models\lookups.py", line 27, in __init__
    self.rhs = self.get_prep_lookup()
  File "D:\#######\v1proj\v1env\lib\site-packages\django\db\models\lookups.py", line 341, in get_prep_lookup
    return super().get_prep_lookup()
  File "D:\#######\v1proj\v1env\lib\site-packages\django\db\models\lookups.py", line 85, in get_prep_lookup
    return self.lhs.output_field.get_prep_value(self.rhs)
  File "D:\#######\v1proj\v1env\lib\site-packages\django\db\models\fields\__init__.py", line 2020, in get_prep_value
    raise e.__class__(

Exception Type: TypeError at /cr
Exception Value: Field 'id' expected a number but got <built-in function id>.
hrirmatl

hrirmatl1#

我可以看到一个错误,你在Html的form标签内的隐藏输入字段中定义了name两次,而且你还没有提供任何value属性,你还应该在视图上使用@require_POST装饰器。通过查看jQuery代码,下面的代码似乎是正确的。
模板档案:

{% for a in objects %}
[...]
<td><button type="button" class="delete-button" data-name="{{ a.id }}" data-bs-toggle="modal" data-bs-target="#deleteModal">Delete</button></td>
[...]
{% endfor %}

[...]

<div class="modal fade" id="deleteModal">
[...]
<form action="{% url 'delete_object' %}" method="post">
{% csrf_token %}
<input type="hidden" id="object_id" name="object_field" value="some_id_needs_to_be_passed_here"/> 
<button type="submit">Delete</button>
[...]

<script>
    $('.delete-button').click(function() {
        $('#object_id').html($(this).data('name'))
    })
</script>

views.py

from django.views.decorators.http import require_POST

@require_POST
def cancel_request(request):
    id = request.POST.get("object_field")
    obj = get_object_or_404(Object, id=id)
    obj.status = "Annulé"
    obj.save()
    return redirect("home")

相关问题