我如何清除以前的AJAX响应数据(不是html/表单数据)?- Django / AJAX



我已经构建了一个Django应用程序,它向我的数据库提交一个AJAX post请求。最初的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 %}

您已经将列表设置为类变量,导致您不断向其添加内容。另外,为什么要使用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)

最后一次回复后,我意识到我做错了什么。我想我需要和你讨论一下才能弄清楚。

最初我在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)

非常感谢你和我一起工作!!

最新更新