首页 > 解决方案 > 从 Django 中的基于类的视图中传递参数

问题描述

我有一个基于类的更新视图“ManifestUpdate”,它是一个模式弹出窗口,并从另一个基于函数的视图“Manifest”中启动。我需要能够从我的 ManifestUpdate 视图中获取 field = 'reference' 并将其作为 'Reference_Nos' 提供给“Manifest”视图。如您所见,ManifestUpdate 应该将用户定向到 Manifest,但它没有,只是没有任何反应(如果我将其更改为定向到任何其他视图,它会起作用)。我相信这是因为我没有传递那个参数。谁能告诉我如何在 ManifestUpdate 中捕获该“引用”参数并将其从基于类的视图传递给 Manifest?

视图.py

class ManifestUpdate(BSModalUpdateView):
    model = Manifests
    template_name = 'manifest_update.html'
    form_class = UpdateManifestForm
    success_message = 'Success: Manifest was updated.'
    success_url = reverse_lazy('manifest')

def manifest(request):
    form = CreateManifestForm(request.POST)

    if request.method == "POST":
        if form.is_valid():

            form.save()
            reference_id = form.cleaned_data.get('reference')
            data = Manifests.objects.all().filter(reference__reference=reference_id)
            form = CreateManifestForm(initial={

               'reference': Orders.objects.get(reference=reference_id),

            })
            total_cases = Manifests.objects.filter(reference__reference=reference_id).aggregate(Sum('cases'))

            context = {
            'reference_id': reference_id,
            'form': form,
            'data': data,
            'total_cases': total_cases['cases__sum'],

            }

            return render(request, 'manifest_readonly.html', context)



        else:
            reference_id = request.POST.get('Reference_Nos')
            data = Manifests.objects.all().filter(reference__reference=reference_id)
            form = CreateManifestForm(initial={

               'reference': Orders.objects.get(reference=reference_id),

            })
            total_cases = Manifests.objects.filter(reference__reference=reference_id).aggregate(Sum('cases'))

            context = {
            'reference_id': reference_id,
            'form': form,
            'data': data,
            'total_cases': total_cases['cases__sum'],

            }

            return render(request, 'manifest_readonly.html', context)

表格.py

class UpdateManifestForm(BSModalForm):
    class Meta:
        model = Manifests
        fields = ('reference', 'cases', 'product_name', 'count', 'CNF', 'FOB')

update_manifest.html

#showing the modal window body
<form method="post" action="">
  {% csrf_token %}

  <div class="modal-header">
    <h3 class="modal-title">Update Manifest</h3>
    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
      <span aria-hidden="true">&times;</span>
    </button>
  </div>

  <div class="modal-body">

    <div class="{% if form.non_field_errors %}invalid{% endif %} mb-2">
      {% for error in form.non_field_errors %}
        {{ error }}
      {% endfor %}
    </div>

    <div class="container">
      <form id="create_mani_form" method="POST">

        <br>
        {% csrf_token %}

          <div class="column">
            <label for="form.reference" class="formlabels">Reference ID: </label><br>
            <!-- <input type="text" value="{{ reference_id }}">-->
             {{ form.reference }}
            <br>
            <br>
            <label for="form.count" class="formlabels">CNF: </label>
            <br>
            {{ form.CNF }}
            <br>

          </div>
          <div class="description">
          <div class="column">
            <label for="form.product_name" class="formlabels">Description: </label>
            <br>
            {{ form.product_name}}
            <br><br>
            <label for="form.count" class="formlabels">FOB: </label>
            <br>
            {{ form.FOB }}
            <br>
          </div>
          </div>
          <div class="column">
            <label for="form.cases" class="formlabels">Cases: </label>
            <br>
            {{ form.cases }}
            <br>
          </div>
          <div class="column">
            <label for="form.count" class="formlabels">Count: </label>
            <br>
            {{ form.count }}
            <br>
          </div>
      </div>


  <div class="modal-footer">
    <button type="button" class="submit-btn btn btn-primary">Update</button>
  </div>

</form>

manifest_readonly.html

#showing the html rendered by the manifest view
{% extends 'base.html' %}
{% load humanize %}

{% block body %}
{% load staticfiles %}

<div class="container">
  <div class="col-xs-12">
    {% if messages %}
    {% for message in messages %}
      <div class="alert alert-success" role="alert">
        <center>{{ message }}</center>
      </div>
    {% endfor %}
    {% endif %}
  </div>
</div>

  <div class="container">
    <form id="create_mani_form" method="POST">

      <br>
      <br>
      <br>
      {% csrf_token %}

      <div class="column">
        <label for="form.reference" class="formlabels">Reference ID: </label><br>
        <!-- <input type="text" value="{{ reference_id }}">-->
         {{ form.reference }}
        <br>
        <br>
        <label for="form.count" class="formlabels">CNF: </label>
        <br>
        {{ form.CNF }}
        <br>

      </div>
      <div class="description">
      <div class="column">
        <label for="form.description" class="formlabels">Description: </label>
        <br>
        {{ form.product_name}}
        <br><br>
        <label for="form.count" class="formlabels">FOB: </label>
        <br>
        {{ form.FOB }}
        <br>
      </div>
      </div>
      <div class="column">
        <label for="form.cases" class="formlabels">Cases: </label>
        <br>
        {{ form.cases }}
        <br>
      </div>
      <div class="column">
        <label for="form.count" class="formlabels">Count: </label>
        <br>
        {{ form.count }}
        <br>


        <label for="form.reference" class="formlabels">Case Total: </label><br>
        <input type="text" value="{{ total_cases|intcomma }}" readonly>
        <br>
        <label for="form.reference" class="formlabels">Total CNF: </label><br>
        <input type="text" value="{{ totalCNF|intcomma }}" readonly>
        <br>
        <label for="form.reference" class="formlabels">Total FOB: </label><br>
        <input type="text" value="{{ totalFOB|intcomma }}" readonly>
      </div>
        <br>
        <br>


    <button type="submit" name="add_mani" style="border-color: #7395AE;">Add Line</button>
  </form>


    <br>
    <h4>Manifest</h4>

    <div class="table-responsive">
    <!--<table  id="manifest_table" class="table table-striped table-bordered table-sm " cellspacing="0"-->
    <table class="table table-striped table-bordered manifest_table" cellspacing="0" style="width="100%">

      <thead>
        <tr>
          <th style="width:2%;"</th>
          <th style="width:10%;">Cases</th>
          <th style="width:60%;">Description</th>
          <th style="width:10%;">Count</th>
          <th style="width:10%">FOB</th>
          <th style="width:10%">CNF</th>

        </tr>
      </thead>

      <tbody>

        {% for manifests in data %}

        <tr>
          <td>

            <!-- Update book buttons -->
          <button type="button" class="update-manifest btn btn-sm btn-primary" style="color: #FFCF8B; border-color: #FFCF8B; background-color: #FFF;" data-id="{% url 'manifest_update' manifests.pk %}">
            <span class="fa fa-pencil"></span>
          </button>
          </td>
          <td>{{ manifests.cases }}</td>
          <td>{{ manifests.product_name}}</td>
          <td>{{ manifests.count}}</td>
          <td>{{ manifests.FOB}}</td>
          <td>{{ manifests.CNF}}</td>

        </tr>

        {% endfor %}

      </tbody>
    </table>
    </div>
    <div class="text-center">
      <a href="{% url 'display_orders' %}" type="submit" class="btn btn-primary" name="button" align="right" style="color: #7395AE; border-color: #7395AE; background-color: #FFF;">Subit Manifest</a>
    </div>

    <div class="modal fade" tabindex="-1" role="dialog" id="modal">
      <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content"></div>
      </div>
    </div>

    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
    <script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
    <script src="https://cdn.datatables.net/1.10.19/js/dataTables.bootstrap4.min.js"></script>
    <script src="jquery.min.js"></script>
    <script src="jquery.fulltable.js"></script>
    <script src="script.js"></script>
    <script src="{% static 'js/jquery.bootstrap.modal.forms.js' %}"></script>

    <script>
      $(function () {
      $(".update-manifest").each(function () {
          $(this).modalForm({formURL: $(this).data('id')});
        });
      });
    </script>

{% endblock %}

jquery.bootstrap.modal.forms.js

(function ($) {

    // Place the form at formURL to modalContent element of modal with id=modalID
    var newForm = function (modalID, modalContent, modalForm, formURL, successURL, errorClass) {
        $(modalContent).load(formURL, function () {
            $(modalID).modal('toggle');
            ajaxSubmit(modalID, modalContent, modalForm, successURL, errorClass);
        });
    };

    // Add AJAX validation to the modalForm
    var ajaxSubmit = function (modalID, modalContent, modalForm, successURL, errorClass) {
        $(modalForm).submit(function (event) {
            // Prevent submit and POST form to url using AJAX
            event.preventDefault();
            $.ajax({
                type: $(this).attr("method"),
                url: $(this).attr("action"),
                // Serialize form data
                data: $(this).serialize(),
                success: function (response) {
                    // Update form with errors after unsuccessful POST request
                    // Django form.is_valid() = False
                    if ($(response).find(errorClass).length > 0) {
                        $(modalID).find(modalContent).html(response);
                        ajaxSubmit(modalID, modalContent, modalForm, successURL, errorClass);
                    }
                    // Hide modal after successful POST request when & redirect to successURL
                    else {
                        $(modalID).modal("hide");
                        window.location.href = successURL;
                    }
                }
            });
        });
    };

    $.fn.modalForm = function (options) {
        // Default settings
        var defaults = {
            modalID: "#modal",
            modalContent: ".modal-content",
            modalForm: ".modal-content form",
            formURL: null,
            successURL: "/",
            errorClass: ".invalid"
        };

        // Extend default settings with provided options
        var settings = $.extend(defaults, options);

        return this.each(function () {
            $(this).click(function (event) {
                newForm(settings.modalID,
                    settings.modalContent,
                    settings.modalForm,
                    settings.formURL,
                    settings.successURL,
                    settings.errorClass);
                event.preventDefault();
            });
        });
    };

}(jQuery));

标签: pythondjango

解决方案


推荐阅读