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'),
您好,我正在尝试填写包含 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'),