Django - 如何根据前端的下拉选择更新视图?

时间:2017-07-30 01:45:04

标签: python django

当用户从下拉列表中选择一个项目时,我想在前端,一种信号被发送到Django后端,并且选择了项目的主键。

Models.py:

class Company(models.Model):
    name = models.CharField(max_length=10, blank=True, null=True)
    code = models.CharField(max_length=2, blank=True, null=True)

我将此模型发送到HTML并将其解压缩:

{% load staticfiles %}
{% load i18n %}
<!DOCTYPE html>
<html>
<head>   
</head>

<body>
   <form action="" method="GET" id="selection-form">
  {% csrf_token %}
    <select>
            {% for company in company_list %}
        <option>
            {{ company.name }}
        </option>
            {% endfor %}
    </select>
     <input type="button" value="Update" id="selection-button">
     </form>
</body>

</html>

现在,用户选择选项,例如公司A,公司B和公司C.如果用户选择说公司A并单击“更新”按钮,它会将主键发送到views.py

Views.py:

def company_selected(request):
    if request.method === 'GET':
        selection = request.GET.get() // Not sure what to have within .get()
        selected_company = Company.objects.filter(pk=selection)
        return selected_company

我实际上不确定我是否在views.py中正确地执行了此操作。从前端发送什么样的信号有助于识别所选选项的主键?

1 个答案:

答案 0 :(得分:3)

您需要修改自己的html文字,才能将id添加到select

html的

<select id = "company-list">
   {% for company in company_list %}
     <option value="{{ company.id }}">
       {{ company.name }}
     </option>
   {% endfor %}
</select>

单击该按钮时,您可以使用.click函数向您的视图发送ajax调用。因此修改.js文件:

// ajax call on your button click
var url = $( '#selection-form' ).attr( 'action' );
$("selection-button").click(function(e) {
    e.preventDefault();
    $.ajax({
        type: "GET",
        url: url,
        data: { 
            id: $('#company-list').val();, 
            },
        success: function(result) {
            alert('ok');
        },
        error: function(result) {
            alert('error');
        }
    });
});

最后,在视图中你可以像这样使用它 views.py

def company_selected(request):
    if request.method == 'GET':
        selection = request.GET.get('id',None) 
        if selection:
            selected_company = Company.objects.filter(pk=selection)
            return selected_company
        else:
            return  #anything you want to send when no id value is sent in the ajax call