【问题标题】:How do I clear previous AJAX response data (NOT html/form data)? - Django/AJAX如何清除以前的 AJAX 响应数据(不是 html/表单数据)? - 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 %}

【问题讨论】:

    标签: jquery json django ajax


    【解决方案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 不会返回任何内容。我知道这是一个不同的问题,但我试图找出那部分,到目前为止我还没有找到一个好的答案。如果您有任何建议,我将不胜感激,否则谢谢!
    • 您是否真的需要使用正则表达式,否则您可以尝试使用icontainsDjango: 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)
    

    非常感谢您在这方面与我合作!!!

    【讨论】:

      猜你喜欢
      • 2018-02-10
      • 2023-03-03
      • 1970-01-01
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 2015-05-09
      相关资源
      最近更新 更多