你好我试图填补这个领域"金额"这与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}}这样的标签吗?如果是这样的话,我如何获得客户?
答案 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'),