【问题标题】:Django dynamic filtering with AjaxDjango 使用 Ajax 进行动态过滤
【发布时间】:2021-10-31 19:51:41
【问题描述】:

我想通过 Ajax 使用我的输入字段的值动态过滤我的 querySet。

现在我正在尝试这样的事情:

模板:

<div class="card mt-3">
        <div class="card-body">
        <form action="" form="get">
            <input data-url="{% url 'klantbeheer' %}" class="zoekklanten" name="q" type="text" placeholder="Zoek op contactnaam...">
        </form>
        {% if object_list %}
                <div class="single-table">
                    <div class="table-responsive">
                        <table class="table text-center">
                            <thead class="text-uppercase bg-dark">
                                <tr class="text-white">
                                    <th scope="col">Bedrijfsnaam</th>
                                    <th scope="col">Contactnaam</th>
                                    <th scope="col">Locatie</th>
                                    <th scope="col">Actie</th>
                                </tr>
                            </thead>
                            <tbody>
                                {% for user in object_list %}
                                <tr>
                                    <td>{{ user.bedrijfsNaam }}</td>
                                    <td>{{ user.contactNaam }}</td>
                                    <td>{{ user.adres }}</td>
                                    <td>
                                        <a href="{% url 'klantupdaten' user.id  %}"><i class="fas fa-edit"></i></a>
                                        <a href="#" data-url="{% url 'klantverwijderen' user.id %}" class="deletegebruiker" data-bs-toggle="modal" data-bs-target="#dynamic-modal"><i class="fas fa-trash-alt"></i></a>
                                    </td>
                                </tr>
                                {% endfor %}
                            </tbody>
                        </table>
                    </div>
                </div>
            {% else %}
            <p>Geen gebruikers gevonden</p>
                <p>
                    <a href="{% url 'klantaanmaken' user.id %}" class="btn btn-primary">Maak klant aan</a>
                </p>
            {% endif %}
        </div>
    </div>

查看:

class ManageUserView(SuperUserRequired, ListView):
    model = User
    template_name = 'webapp/klant/beheerklant.html'


    #Query based upon contactName
    def get_queryset(self, query):
        

        #Contactnaam bevat QUERY EN superuser is vals.
        object_list = self.model.objects.filter(contactNaam__icontains=query).exclude(is_superuser=True)
        
        return object_list

    def post(self, request, *args, **kwargs):
        query = self.request.POST.get('query', '')
        print(query)
        self.get_queryset(query)

jquery:

$('.zoekklanten').on('keyup', function(){
    var url = $(this).data('url')
    var query = $(this).val();

    $.ajax({
        url:url,
        type:'POST',
        data:{
            'query':query
        },
        dataType: 'json',
            beforeSend: function(xhr, settings){
                if(!csrfSafeMethod(settings.type) && !this.crossDomain){
                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
                }
            },
            success: function(result){
            },
            error: function(data){
            }

     })})

我收到“get_queryset() 缺少 1 个必需的位置参数:‘query’”错误。我认为在 post 请求函数中调用 get_queryset 函数不是解决这个问题的方法。

在 Django 中使用 Ajax 动态过滤的最佳方法是什么?

【问题讨论】:

  • 您的代码真的如上所示缩进了吗?如果是这样,您必须缩进post()get_queryset(),以便它们嵌套在ManageUserView 类中。如果它们已经嵌套在那里,请修复代码缩进。
  • 不,不是,我修复了缩进。

标签: javascript jquery django


【解决方案1】:

您的问题是方法ListView.get_queryset()通常是在没有任何额外参数的情况下定义的,因此当它被Django隐式调用时,它不会将任何值传递给您在那里添加的新额外参数query

所以要么直接在get_queryset() 中使用self.request.POST.get('query', ''),而不是将其作为参数传递到那里,或者为参数添加一个默认值。

但是,使用用户输入并将其直接传递给 SQL 查询是有风险的,因为它可能导致 SQL 注入(即使 Django 尝试清理该值)。

def get_queryset(self, query=None):
    # either set default value for `query` here^
    if not query:
        return super().get_queryset()

    # or take the value from `POST` here instead of passing it as a parameter to the method
    query = self.request.POST.get('query')
    object_list = self.model.objects.filter(contactNaam__icontains=query).exclude(is_superuser=True)
    
    return object_list

【讨论】:

  • 感谢您的帮助!但是当我尝试您的第二个选项时,我收到 POST 405 错误(不允许使用方法)
  • 是的,当然,因为它不是……你知道吗?总会有另一个问题,所以与其无限期地在这里捎带,不如打开一个新问题。提示:找出ListView支持的请求方法。
  • 我只是想要一种使用 AJAX 进行动态过滤的方法。最好的方法是什么(有效)?
  • 我可以理解您来自哪里,但同样:这与已解决的原始问题无关。您可以一遍又一遍地在这里捎带,就像“现在可行,但现在又出现了另一个问题......看,另一个......还有一个”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2012-08-13
  • 1970-01-01
  • 2016-01-20
相关资源
最近更新 更多