Django - 动态创建元素

时间:2016-04-07 07:40:29

标签: django django-models django-views

我正在Django制作一个完整的管理员和发票应用程序。

对于发票应用,用户点击"创建销售发票"出现发票屏幕。

现在我希望系统在出现此屏幕时动态生成新帐单,但不会保存。当用户开始输入物品时,我想要一个新的物品细节(即每个物品有一个物品细节,其中包含物品清单,数量和价格)。

但是,除非用户点击创建帐单按钮,否则不会保存任何内容。

我需要有关如何做这件事的帮助,即在用户转到创建账单时创建账单和项目详细信息,用外键链接这两个,但如果用户没有结束,还可以选择丢弃它们点击"保存"按钮。

修改1

我的发票HTML:

{% extends "base.html" %}


{% block title %}

{% load static from staticfiles %}
<script src="{% static 'bill/script.js' %}"></script>

<link rel="stylesheet" href="{% static 'bill/style.css' %}">

<title>Sales Invoice</title>

{% endblock %}



{% block content%}
<invoice>
<div id="invoice">
<invoiceheader>
    <!--
    <h1>Invoice</h1>
    <address>
        <p>Jonathan Neal</p>
        <p>101 E. Chapman Ave<br>Orange, CA 92866</p>
        <p>(800) 555-1234</p>
    </address>
    <span><img alt="" src="logo.png"><input type="file" accept="image/*"></span>
-->
</invoiceheader>
<invoicearticle>
    <!--<h1>Recipient</h1>-->
    <code>
        <p>Customer code: 
            <input id="customer-code" ></input></p>
    </code>
    <address>
        <p></p>
        <p id="companyname">Some Company</p>
        <p id = "companyaddress">c/o Some Guy</p>
    </address>
    <table class="meta">
        <tr>
            <th><span>Invoice #</span></th>
            <td><span>101138</span></td>
        </tr>
        <tr>
            <th><span>Date</span></th>
            <td><span></span></td>
        </tr>
        <tr>
            <th><span>Amount Due</span></th>
            <td><span id="prefix">Rs. </span><span>600.00</span></td>
        </tr>
    </table>
    <table class="inventory" id="inventory_table">
        <thead>
            <tr>
                <th colspan="1"><span>Item Code</span></th>
                <th colspan="2"><span>Item Name</span></th>
                <th colspan="1"><span>Unit Rate</span></th>
                <th colspan="1"><span>Discount 1</span></th>
                <th colspan="1"><span>Quantity</span></th>
                <th colspan="1"><span>Discount 2</span></th>
                <th colspan="1"><span>Free Quantity</span></th>
                <th colspan="1"><span>VAT Type</span></th>
                <th colspan="1"><span>VAT</span></th>
                <th colspan="1"><span>Net Rate</span></th>
            </tr>
        </thead>
        <form>
        <tbody>
            <tr>
                <td colspan="1"><a class="cut">-</a><span class="itemcode"  contenteditable></span></td>
                <td colspan="2"><span contenteditable></span></td>
                <td colspan="1"><span contenteditable>150.00</span></td>
                <td colspan="1"><span contenteditable></span></td>
                <td colspan="1"><span contenteditable>4</span></td>
                <td colspan="1"><span contenteditable></span></td>
                <td colspan="1"><span contenteditable></span></td>
                <td colspan="1"><span contenteditable></span></td>
                <td colspan="1"><span contenteditable></span></td>
                <td colspan="1"><span contenteditable></span></td>
            </tr>           
        </tbody>
        </form>
    </table>
    <a class="add">+</a>
    <table class="balance">
        <tr>
            <th><span>Total</span></th>
            <td><span data-prefix></span><span>600.00</span></td>
        </tr>
        <tr>
            <th><span>Amount Paid</span></th>
            <td><span data-prefix></span><span>0.00</span></td>
        </tr>
        <tr>
            <th><span>Balance Due</span></th>
            <td><span data-prefix></span><span>600.00</span></td>
        </tr>
    </table>
</article>

</div>
</invoice>


<script type="text/javascript">
/*  url_sellbill = '{% url "billbrain:sellbill" %}'   */
    csrf_token='{{csrf_token}}'

</script>


{% endblock %}

我的相关jquery文件(只是必要部分):

生成表:

function generateTableRow() {
var emptyColumn = document.createElement('tr');



emptyColumn.innerHTML = '<td><a class="cut">-</a><span class="itemcode" contenteditable></span></td>' +
    '<td colspan="2"><span contenteditable></span></td>' +
    '<td><span contenteditable>100.00</span></td>' +
    '<td><span contenteditable></span></td>' +
    '<td><span contenteditable></span></td>'+
    '<td><span contenteditable></span></td>' +
    '<td><span contenteditable></span></td>'+
    '<td><span contenteditable></span></td>' +
    '<td><span contenteditable></span></td>' +
    '<td><span contenteditable></span></td>' ;


return emptyColumn;
}

在用户输入客户代码时添加客户详细信息:

$( "#customer-code" ).change(function() {

/*alert( "Handler for .change() called." );*/
var input = $("#customer-code").val();
(function() {
    $.ajax({
        url : "", 
        type : "POST", 
        data : { customer_code: input,
                 datatype: 'customer',
                 'csrfmiddlewaretoken': csrf_token}, // data sent with the post request
        dataType: 'json',

                // handle a successful response
        success : function(jsondata) {
            $('#companyname').html(jsondata['name'])
            $('#companyaddress').html(jsondata['address'])
            console.log(jsondata); // log the returned json to the console
            console.log("success"); // another sanity check
        },


        });
  }());

});

同样,对于产品,在用户输入产品ID时,会自动生成其他详细信息:

  $("#inventory_table").on("focus", ".itemcode", function(){
    $(this).data("initialText", $(this).html());
    /*alert( "On focus for table inventory called." );*/
    });

$("#inventory_table").on("blur", ".itemcode", function(){
/*alert( "On blur for table inventory called." );*/
var input = $(this).html();

if ($(this).data("initialText") !== $(this).html()) {

    var el = this;
    /*valueis='Hi 5'
    alert($(this).closest('tr').find('td:nth-child(4) span').html());*/
    (function() {
        $.ajax({
            url : "", 
            type : "POST", 
            data : { item_code: input,
                     datatype: 'item',
                     'csrfmiddlewaretoken': csrf_token}, // data sent with the post request
            dataType: 'json',

                // handle a successful response
            success : function(jsondata) {  
                $(el).closest('tr').find('td:nth-child(2) span').html(jsondata['name'])
                $(el).closest('tr').find('td:nth-child(2) span').html(jsondata['name'])
                $(el).closest('tr').find('td:nth-child(3) span').html(jsondata['sellingprice'])

                console.log(jsondata); // log the returned json to the console
                alert(jsondata['name']);
                console.log("success"); // another sanity check
            },

        });
    }());
  }
});

最后,这是我的views.py文件的相关功能:

def bill(request):

if request.method == 'POST':
    datatype = request.POST.get('datatype')
    if (datatype == 'customer'):
        customerkey = request.POST.get('customer_code')
        response_data = {}
        response_data['name'] = Customer.object.get(customer_key__iexact=customerkey).name
        response_data['address'] = Customer.object.get(customer_key__iexact=customerkey).address
        jsondata = json.dumps(response_data)
        return HttpResponse(jsondata)

    if (datatype == 'item'):
        productkey = request.POST.get('item_code')
        response_data = {}
        response_data['name'] = Product.object.get(prodkey__iexact=productkey).name
        response_data['sellingprice'] = float(Product.object.get(prodkey__iexact=productkey).selling_price)
        #response_data['address'] = Product.object.get(prodkey__iexact=productkey).address
        jsondata = json.dumps(response_data)
        return HttpResponse(jsondata)


return render(request, 'bill/invoicing.html')

1 个答案:

答案 0 :(得分:0)

您应该使用Model Forms向用户输出表单,以便在提交后填充并创建对象。如果需要在表单中预先填写一些信息,也可以使用一些上下文数据。

另一种方法是创建一个对象并将其标记为&#34; CANCELED&#34;如果你想记住一些用户的尝试(有时可能有用)或者只是将其删除(如果非常常情况,那么可能会导致性能问题,以免填写开始账单)。