django forms ajax 从数据库中获取客户的数据

django forms ajax get client's data from db

您好,我正在尝试填写包含 payment_plan 价格的字段 "amount",而 payment_plan 是客户信息的一部分。我一直在搜索,实现它的方法是实现 Ajax,但我还没有找到 Django 表单的示例,每个解决方案都与我的完全不同。

这是型号:

class Payment_Plans(models.Model):
    name = models.CharField(max_length=20, primary_key=True)
    price = models.IntegerField(default='0')
    def __unicode__(self):
        return self.name

class Clients(models.Model):
    id = models.IntegerField(max_length=10, primary_key=True, default=0)
    payment_plan = models.ForeignKey(Payment_Plans, null=True)
    def __unicode__(self):
        return self.id

class Payments(models.Model):
    client = models.ForeignKey(Clients)  
    month_from = models.DateField(default='1111-01-01')
    month_to = models.DateField(default='1111-01-01')
    amount = models.IntegerField(default='0')

    def __unicode__(self):
        return self.month_from.strftime('%Y-%m-%d')

这是我的付款表格:

class PaymentsForm(forms.ModelForm): 
    month_from = forms.DateField(widget=DateTimePicker(options={"format": "YYYY-MM-DD", "pickTime": False}), label="Mes desde")
    month_to = forms.DateField(widget=DateTimePicker(options={"format": "YYYY-MM-DD", "pickTime": False}), label="Mes Hasta")
    amount = forms.IntegerField(label="Monto")
    client =  forms.ModelChoiceField(queryset=Clients.objects.all(), label="Cliente")

    class Meta:
        model=Payments
        fields = ('month_from', 'month_to', 'amount', 'client')

这是模板:

{% extends 'base.html' %}
{% load bootstrap %}

{% block titulo %}Realizar Pago{% endblock%}

{% block encabezado %} 
    <h1>Realizar Pago</h1>
    <!-- Para el datepicker -->
    {{ form.media }}
{% endblock%}

{% block contenido %} 
    <form id='form' method='POST' action=''>{% csrf_token %}
        <div class="col-sm-4">
        </div>
        <div class="col-sm-4">
            {{ form.client|bootstrap }}
            {{ form.month_from|bootstrap }}
            {{ form.month_to|bootstrap }}
            {{ form.amount|bootstrap }}
            {{ form.days_left|bootstrap }}
            <input type='submit' name='submit' value='Pagar' class="btn btn-default"/>
        </div>  
    </form>
{% endblock%}

这应该像这样工作:

1) 用户 select 是客户端(现在它只是一个 select 框,在未来的自动完成字段中)

2) 表格应查看客户的 payment_plan,然后查看 payment_plan 价格。

3) 字段应填写价格

我怎样才能做到这一点? django 表单有可能吗?我应该手动编写模板而不是使用像 {{forms.client}} 这样的标签吗?如果是这样,我如何获得客户?

您可以使用 AJAX,您只需要知道字段的 ID。在将客户端 ID 发送到视图的 'client' 字段上设置一个 onchange(或者 .change(),如果您使用 jquery)事件,例如,'/client-price' 将用它来查询其他价格。类似于:

$( "#client" ).change(function() {
  clientID = $(this).val();
  $.ajax({
      type: "GET", // if you choose to use a get, could be a post
      url: "/client-price/?id=" + clientID,
      success: function(data) {
          $( "#amount" ).val(data.price);
});

view/url 将采用 id。 This post 展示了您希望如何格式化视图以发回 json 响应。

谢谢奥涅卡!在对 ajax 和 json 进行一些研究后,代码如下所示:

查看:(记得从django.http导入JsonResponse导入)

def amount(request):
if request.method == 'GET':
    total_amount = model.amount
    response_data ={}
    response_data['amount'] = total_amount

return JsonResponse(response_data)

ajax.js:

    $(document).ready(function() {
    $('#id_client').change(function(){
        var query = $(this).val();
        console.log(query);
        $.ajax({
            url : "/amount/",
            type : "GET",
            dataType: "json",
            data : {
                client_response : query
                },
            success: function(json) {
                document.getElementById('id_amount').value=json.amount;
            },
            failure: function(json) { 
                alert('Got an error dude');
            }
        });
    });
});

url.py 添加对应行:

 url(r'^amount/$', 'main.views.amount', name='amount'),