我在基于django的网站上有一个文本区域,显示数据库字段的内容。 我希望能够编辑此字段并将其提交给更新数据库中字段的函数。
我知道如何调用views.py中的函数,然后使用render_to_response将查询结果发送回新网页。
总而言之,如何使用html表单在django / python脚本中添加函数而无需引用其他URL?
答案 0 :(得分:3)
使用AJAX:
1)创建一个视图来处理表单提交:
def my_ajax_form_submission_view(request):
if request.method == 'POST':
form = MyForm(request.POST)
if form.is_valid():
# save data or whatever other action you want to take
resp = {'success': True}
else:
resp = {'success': False}
return HttpResponse(simplejson.dumps(resp), mimetype='application/json')
else:
return HttpResponseBadRequest()
然后,将视图绑定到您的urlpatterns
2)通过AJAX提交表单(使用jQuery):
$('#my-form-id').submit(function(){
var $form = $(this);
$.post('/url/to/ajax/view/', $form.serialize(), function(data, jqXHR){
if (data.success) {
alert('Form submitted!');
} else {
alert('Form not valid');
}
});
return false;
});
这是基础知识。您可以而且应该提供更详细的退货响应,错误处理,表单验证/检查等。
答案 1 :(得分:2)
通常建议使用Post/Redirect/Get模式,例如:
def myview(request, **kwargs):
if request.POST:
# validate the post data
if valid:
# save and redirect to another url
return HttpResponseRedirect(...)
else:
# render the view with partial data/error message
if request.GET:
# render the view
return render_to_response(...)
答案 2 :(得分:1)
这是我一直在使用的标准视图代码模式。
def payment_details(request, obj_id):
yourobj = get_object_or_404(Obj, pk=obj_id)
form = TheForm(instance=yourobj)
if request.method == 'POST':
form = TheForm(request.POST, instance=yourobj)
if form.is_valid():
yourobj = form.save()
messages.success(request, 'Yourobj is saved!')
url = reverse('SOMEURL')
return redirect(url)
template = 'SOMETEMPLATE'
template_vars = {'TEMPLATEVARS': TEMPLATEVARS}
return render(request, template, template_vars)
在DjangoCon上观看Advanced Forms talk后,可以像这样重写上述视图:
def payment_details(request, obj_id):
yourobj = get_object_or_404(Obj, pk=obj_id)
form = TheForm(request.POST or NONE, instance=yourobj)
if request.method == 'POST' and form.is_valid():
yourobj = form.save()
messages.success(request, 'Yourobj is saved!')
url = reverse('SOMEURL')
return redirect(url)
template = 'SOMETEMPLATE'
template_vars = {'TEMPLATEVARS': TEMPLATEVARS}
return render(request, template, template_vars)