我尝试从一个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>.
1条答案
按热度按时间hrirmatl1#
我可以看到一个错误,你在Html的form标签内的隐藏输入字段中定义了
name
两次,而且你还没有提供任何value
属性,你还应该在视图上使用@require_POST
装饰器。通过查看jQuery代码,下面的代码似乎是正确的。模板档案:
views.py