如何清除以前的 AJAX 响应数据(不是 html/表单数据)? - Django/AJAX
Posted
技术标签:
【中文标题】如何清除以前的 AJAX 响应数据(不是 html/表单数据)? - Django/AJAX【英文标题】:How do I clear previous AJAX response data (NOT html/form data)? - Django/AJAX 【发布时间】:2021-04-22 00:58:17 【问题描述】:我已经构建了一个 Django 应用程序,该应用程序将 AJAX 发布请求提交到我的数据库。最初的 post 请求工作正常,但之前的每个请求也会在第一次响应后返回。
底线:有什么方法可以清除之前的 AJAX 请求/响应?
这是我启动服务器并提交第一个请求时的第一个响应(请求是针对 pk:1):
MedInput page loaded (index):46
Med Input Form Submitted (index):49
csrfmiddlewaretoken=i889gLsqdY9glqI59wRXLTOVehz9Lmp1i5IRikOsgvrGdBD9OpISolDrJ8pqJDmV&input_meds=lisinopril (index):53
(index):60
[…] (index):61
0: model: "medrec_app.medication", pk: 1, fields: …
length: 1
__proto__: Array(0)
这是我提交另一个请求时发生的情况(此请求是针对 pk:3):
Med Input Form Submitted (index):49
csrfmiddlewaretoken=i889gLsqdY9glqI59wRXLTOVehz9Lmp1i5IRikOsgvrGdBD9OpISolDrJ8pqJDmV&input_meds=lisinopril (index):53
(index):60
(2) […, …] (index):61
0: model: "medrec_app.medication", pk: 1, fields: …
1: model: "medrec_app.medication", pk: 3, fields: …
length: 2
__proto__: Array(0)
当我同时请求 pk:1 和 pk:3 时会发生以下情况:
Med Input Form Submitted (index):49
csrfmiddlewaretoken=i889gLsqdY9glqI59wRXLTOVehz9Lmp1i5IRikOsgvrGdBD9OpISolDrJ8pqJDmV&input_meds=lisinopril (index):53
(index):60
(4) […, …, …, …] (index):61
0: model: "medrec_app.medication", pk: 1, fields: …
1: model: "medrec_app.medication", pk: 3, fields: …
2: model: "medrec_app.medication", pk: 3, fields: …
3: model: "medrec_app.medication", pk: 1, fields: …
length: 4
__proto__: Array(0)
我只想要来自最近 AJAX 请求/响应的响应(如最后一个示例所示,它包含可变数量的模型,而不仅仅是最后一个)。
我尝试设置 $.ajax(..., cache: false, ...)
,但没有做任何事情,我尝试清空尽可能多的字典/列表。
有什么方法可以清除之前的请求/响应?我错过了什么?
这是我的代码:
views.py
class postMedRec(View):
form_class = MedInputForm
template_name = 'medrec_app/med_input.html'
med_match = []
med_set = Medication.objects.all()
def post(self, request):
if self.request.is_ajax and self.request.method == "POST":
form = self.form_class(self.request.POST)
if form.is_valid():
input_meds = form.cleaned_data['input_meds']
for med in self.med_set:
if re.search(med.generic_name,input_meds, re.IGNORECASE):
self.med_match.append(med)
ser_meds=
ser_meds = serializers.serialize('json',self.med_match)
return JsonResponse('med_output':ser_meds, status = 200)
else:
return JsonResponse("error", form.errors, status= 200)
return JsonResponse("error":"", status=400)
urls.py
app_name="medrec_app"
urlpatterns = [
path('', MedInputView.as_view(), name="med_input"),
path('post/ajax/med_rec/', postMedRec.as_view(), name="post_medrec"),
path('meds/', MedicationList.as_view(), name="med_list"),
path('meds/<int:pk>/', MedicationDetail.as_view(), name="med_detail"),
path('meds/add/', AddMedView.as_view(), name="add_med"),
]
med_input.html(我的模板):
% extends 'base.html' %
% block header %
<div class="container-fluid">
<h1 class="display-2">Medication Reconciliation</h1>
</div>
% endblock header %
% block content %
<div class="container-fluid">
<form id="med_input_form">
<div class="form-group" >
% csrf_token %
<label for="form.input_meds.id_for_label">form.input_meds.label</label>
form.input_meds
</div>
<button type="submit" class="btn btn-primary">Reconcile Meds</button>
</form>
</div>
<div class="container-fluid">
<ul id="med_output">
</ul>
</div>
<script>
console.log('MedInput page loaded');
$("#med_input_form").submit(function(event)
console.log('Med Input Form Submitted');
event.preventDefault();
var serializedData = $(this).serialize();
console.log(serializedData);
$.ajax(
type: "POST",
url: '% url "medrec_app:post_medrec" %',
data: serializedData,
success: function(response)
$('#med_output').html("");
console.log($('#med_output').html());
console.log(JSON.parse(response["med_output"]));
var med_ajax = JSON.parse(response["med_output"]);
$('#med_output').html('<li>'+med.fields.generic_name+'</li>');
)
);
</script>
% endblock content %
% block javascript %
% endblock javascript %
【问题讨论】:
【参考方案1】:您已将列表设置为类变量,导致您不断追加它。还有你为什么要使用 re 模块来搜索?,把它留给数据库有__iexact
,__exact
,__contains
,__icontains
,__regex
,__iregex
和更多可用在 django 时查询。
这应该按预期工作:
class postMedRec(View):
form_class = MedInputForm
template_name = 'medrec_app/med_input.html'
med_set = Medication.objects.all()
def post(self, request):
if self.request.is_ajax and self.request.method == "POST":
form = self.form_class(self.request.POST)
if form.is_valid():
input_meds = form.cleaned_data['input_meds']
med_match = list(self.med_set.filter(generic_name__iregex=input_meds))
ser_meds=
ser_meds = serializers.serialize('json',med_match)
return JsonResponse('med_output':ser_meds, status = 200)
else:
return JsonResponse("error", form.errors, status= 200)
return JsonResponse("error":"", status=400)
【讨论】:
现在的问题是,如果我写了多个可能的匹配项(例如amlodipine lisinopril
),则 iregex 不会返回任何内容。我知道这是一个不同的问题,但我试图找出那部分,到目前为止我还没有找到一个好的答案。如果您有任何建议,我将不胜感激,否则谢谢!
您是否真的需要使用正则表达式,否则您可以尝试使用icontains
和Django: Query using contains each value in a list 在空间上拆分您的 input_meds 后显示的内容
我认为我确实需要正则表达式,原因有两个:1)我正在尝试与list(self.med_set.filter(...)
相反。我没有使用med_input
来查找特定的数据库条目,而是尝试查看是否在med_input
中找到了任何数据库条目(这是for med in self.med_set
的基本原理)。 2)我的搜索词需要更复杂;我需要数据库在 med_input 中查找多个术语。似乎正则表达式是完成此任务的最简单方法。我基本上是想让数据库根据med_input
的每一行来寻找“最佳匹配”。
如何将多个值(正则表达式)发布到同一个键input_meds
,然后使用上面给出的链接使用iregex
循环它们。您的第 1 点无效,因为结果是相同的,您正在检查一个条目是否与您的正则表达式匹配,如果匹配,则将该条目添加到列表中。【参考方案2】:
AANNNNDDD 在我最后一次回复之后,我意识到我做错了什么。我想我需要和你讨论才能弄清楚。
最初我在POST
函数之外声明了med_match = []
,这导致了问题。
我在POST
函数中添加了self.med_match = []
,这解决了我遇到的问题。
所以这很完美:
class postMedRec(View):
form_class = MedInputForm
template_name = 'medrec_app/med_input.html'
med_match = []
med_set = Medication.objects.all()
def post(self, request):
if self.request.is_ajax and self.request.method == "POST":
form = self.form_class(self.request.POST)
if form.is_valid():
self.med_match = []
input_meds = form.cleaned_data['input_meds']
for med in self.med_set:
if re.search(med.generic_name,input_meds, re.IGNORECASE):
self.med_match.append(med)
ser_meds = serializers.serialize('json',self.med_match)
return JsonResponse('med_output':ser_meds, status = 200)
else:
return JsonResponse("error", form.errors, status= 200)
return JsonResponse("error":"", status=400)
非常感谢您在这方面与我合作!!!
【讨论】:
以上是关于如何清除以前的 AJAX 响应数据(不是 html/表单数据)? - Django/AJAX的主要内容,如果未能解决你的问题,请参考以下文章
在使用 Newtonsoft 之后,ajax 调用在 asp.net 中返回 HTML 响应而不是 Json