【问题标题】:POST doesn't write to databasePOST 不写入数据库
【发布时间】:2017-12-07 19:19:44
【问题描述】:

我在下面有我的 requestaccess 视图,如果我删除 if request.method == 'POST',它将写入我的数据库,但如果我保留它。请求永远不会被写入。我试图了解为什么 POST 没有发生以及如何使它发生?

def requestaccess(request):

    owner = User.objects.get (formattedusername=request.user.formattedusername)

    reportdetail = QVReportAccess.objects.filter(ntname = owner.formattedusername, active = 1).values('report_name_sc')
    reportIds = QVReportAccess.objects.filter(ntname = owner.formattedusername).values_list('report_id', flat=True)
    checkedlist = request.GET.getlist('report_id')
    reportlist = QvReportList.objects.filter(report_id__in= checkedlist, active = 1).values_list('report_name_sc',flat = True)


    coid = User.objects.filter(coid = request.user.coid).filter(formattedusername=request.user.formattedusername)
    facilitycfo =  QvDatareducecfo.objects.filter(dr_code__exact = coid , active = 1, cfo_type = 1).values_list('cfo_ntname', flat = True)
    divisioncfo =  QvDatareducecfo.objects.filter(dr_code__exact = coid, active = 1, cfo_type = 2).values_list('cfo_ntname', flat = True)
    selectedaccesslevel = '7'
    if request.method == 'POST':
        selectedaccesslevel = request.POST.get('accesslevelid')
        print(selectedaccesslevel)
    selectedphi = '0'
    if request.method == 'POST':
        selectedphi = request.POST.get('phi')
        print(selectedphi)
    if request.method == 'POST':
        for i in checkedlist:
            requestsave = QVFormAccessRequest(ntname = owner.formattedusername, first_name = owner.first_name, last_name = owner.last_name, coid = owner.coid, facility = owner.facility, title = owner.title
                                      ,report_id = i, accesslevel_id = selectedaccesslevel, phi = selectedphi, access_beg_date = '2017-01-01 00:00:00', access_end_date = '2017-01-31 00:00:00')
            requestsave.save()

    args = {'retreivecheckbox': reportlist, 'cfo7':facilitycfo, 'cfo5':divisioncfo, 'checkedlist':checkedlist }

    return render(request,'accounts/requestaccess.html', args)
#    return render(request, 'accounts/requestaccess.html', args)

我的 request.method == 'POST' 语句永远不会返回正确的值,只会返回用于测试的硬编码值。

我的模板 requestaccess.html 可以在下面找到。当我更改选择选项以及单击按钮时,我可以看到 ajax 函数的 POST 请求正在更新。

{% extends 'base.html' %}

  {% block head %}
  <title> Access Request Form </title>
  {% endblock %}

  {% block body %}

    <div class="container">
      <div class="row">
        <div class="col">
          <h2>{{ user.username }}</h2></br>
          <ul>
            <li>Employee First Name: {{ user.first_name }}</li>
            <li>Employee Last Name: {{ user.last_name }}</li>
            <li>Coid: {{ user.coid }}</li>
            <li>Facility: {{ user.facility }}</li>
            <li>Title: {{user.title}}</li>

          </ul>
        </div>
        <div class="col">

  <form action = "{% url 'requestaccess' %}" form method = "POST">
    {% csrf_token %}
          <h2>Applications:</h3></br>

            {% for app in retreivecheckbox %}
            <li><input type="checkbox" name="report_id" value ="{{app.report_id}}" checked> {{ app }}
              </li>
            {% endfor %}
        </div>

      </div>


      <div class="row">
        <div class="col">
          <label for="accesslevel"><h3>Access Level</h3></label>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<select title ="accesslevelid" class="form-control my_select" id="accesslevelid">
            <option value=""> Please select your access level  </option>
            <option value="7"> Facility  </option>
            <option value="5"> Division  </option>
            <option value = "3"> Corporate  </option>
            <option value = "6"> Market  </option>
            <option value = "4"> Group  </option>
</select>

        </div>
        <div class="col">


          <label for="phi"><h3>PHI</h3></label>

          <select class="form-control my_select" id="phi" title = "phi" >
            <option value = ""> Please select if you need access to PHI data </option>
            <option value = "0"> No  </option>
            <option value = "1"> Yes  </option>

          </select>

        </div>
      </div>

        <div class="row">
  <div class="container">
    <div class="row">
      <div class="col">
 </br> </br>

  <button href="{% url 'submitted' %}" class="btn btn-primary my_select" type = "submit"> Submit </button>
              <script>
          $(document).ready(function () {
              $('.my_select').on('change', function () {
                  var phi = $('#phi').val();
                  var accesslevelid = $('#accesslevelid ').val();
                  $.ajax({ url: "{% url 'requestaccess' %}",
                          headers: { 'X-CSRFToken': '{{ csrf_token }}' },
                          data: {
                            phi: phi,
                            accesslevelid: accesslevelid,
                          },
                          type: 'POST',
                          success: function (result) {
                            ;
                          },
                        });
                });
            });
          </script>
</div>


  </form>

  {% endblock %}

下面是显示 POST 的控制台:

[07/Dec/2017 13:21:14] "GET /account/requestaccess/?report_id=84&report_id=87&report_id=88 HTTP/1.
3

[07/Dec/2017 13:21:22] "POST /account/requestaccess/ HTTP/1.1" 200 3928
3
1

单击提交按钮后,它会显示以下内容:

[2017 年 12 月 7 日 13:33:59]“POST /account/requestaccess/HTTP/1.1”200 3776 没有任何 无

编辑:

将 javascript 更改为 on('click' 而不是 on('change' 会产生相同的 None 值。

【问题讨论】:

    标签: ajax django django-views


    【解决方案1】:

    checkedlist = request.GET.getlist('report_id') 是罪魁祸首。您正在从 GET 请求中填充它,当您发布时,它们不会以任何方式转移。

    因此,checkedlistNone,并且保存语句永远不会触发。

    【讨论】:

    • 如何将 GET 请求发送到同一视图中的 POST?更多 ajax?
    • 从您的问题中不清楚您是如何使用 GET 请求的,但您需要它成为提交表单产生的 POST 请求的一部分。 (因此一种方法是使用 GET 请求在表单上预填充设置,然后将这些设置与用户在表单上选择的任何其他内容一起发布。)
    • 我的 GET 请求来自一个名为 Profile 的页面,用户在该页面中选择了一组复选框。 requestaccess 的 URL 包括 report_id = 并且报告名称被传递给模板,并带有预先选中的复选框。然后用户更改一些其他选项,然后推送提交,这是上面使用
      定义的 POST 请求应该发生的地方。
    • 报告名称生成如下:checkedlist = request.GET.getlist('report_id') reportlist = QvReportList.objects.filter(report_id__in= checkedlist, active = 1).values_list('report_name_sc' ,flat = True),这就是我在那里使用 GET 的方式。我是这种开发的新手,所以如果我的逻辑不正确或者有更好的方法可以告诉我。
    猜你喜欢
    • 2020-12-31
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 2017-11-04
    • 2011-11-09
    • 2020-08-19
    相关资源
    最近更新 更多