如何清除以前的 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

如何在警报管理器中清除以前的警报?

ajax html响应中的AngularJs数据绑定

如何从 AJAX 响应中删除所有 href

如何将从 Ajax 请求收到的响应重定向到另一个 html 页面

带有滚动条的 HTML 文本框或区域,用 Ajax 响应填充