django形成ajax从db获取客户端的数据

时间:2015-04-03 01:45:04

标签: ajax django forms autofill

你好我试图填补这个领域"金额"这与payment_plan的价格有关,而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)用户选择客户端(现在只是一个选择框,在将来的自动填充字段中)

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

3)字段应填写价格

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

2 个答案:

答案 0 :(得分:1)

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

$( "#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响应。

答案 1 :(得分:1)

谢谢onyeka!经过对ajax和json的一些研究后,代码看起来像这样:

view :(记得从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'),