我想这样做:
我试图在详细视图上创建一个表单输入,该表单输入将更新详细模型实例的特定数据列(“状态”)。这是我的想法的图片:
选择器将显示当前状态,用户可以对其进行更改并从详细视图进行更新,而不必访问UpdateView。
我的想法是要发生这种情况: 1.在提交时,获取新用户输入的值。 2.获取当前详细类的模型实例 3.将模型实例属性分配为用户输入的值 4.保存模型实例
我已经尝试:我不知道这是否是最好的方法,但是我一直在尝试创建AJAX调用,主要是通过在线查找示例。>
结果:终端显示提交后的帖子:“ [19 / Nov / 2019 17:50:33]” POST / task / edit / 4 HTTP / 1.1“ 200 41256”。但是,数据不会保存到数据库。刷新后,选择器将返回到先前保存的状态。
控制台显示:“脚本已连接”和“更新状态”,没有错误。提交后,警报显示成功消息:“ 127.0.0.1:8000表示状态已更新”。
Task_detail.html
<div class="deliv-box edit">
<form id="status-update-form" method='POST' action='{% url "task_edit" task.pk %}'>
{% csrf_token %}
{{task_form.status}}
<input id="status-update-btn" type="submit" value="Update Status" />
</form>
</div>
...
<script type="text/javascript">
var frm = $('#status-update-form');
frm.submit(function () {
console.log("script is connected")
console.log($('#status-update-btn').val())
$.ajax({
type: frm.attr('method'),
url: frm.attr('action'),
data: frm.serialize(),
success: function (data) {
$("#deliv-box edit").html(data);
alert("status updated");
},
error: function(data) {
alert("error");
}
});
return false;
});
</script>
forms.py
class TaskForm(forms.ModelForm):
class Meta:
model = Task
fields = "__all__"
views.py
class TaskDetail(ModelFormMixin, DetailView):
template_name='task_detail.html'
model = Task
form_class = TaskForm
def get_context_data(self, **kwargs):
context = super(TaskDetail, self).get_context_data(**kwargs)
context['task_form'] = self.get_form
return context
def update(request):
if request.method=='POST':
task_id = request.POST.get('id')
task = Task.objects.get(pk = task_id)
status_obj = request.POST.get('status')
task.status = status_obj
task.save()
return JsonResponse({'status':'updated...'})
else:
return JsonResponse({'status':'not updated'})
谢谢。
答案 0 :(得分:0)
您正在覆盖不存在的方法=index(filter(Global!C5:C243,A2= Global!A5:A243,Global!B5:B243 >= B1,Global!B5:B243 < C1),1)
,因此永远不会调用它。
您需要继承update
而不是UpdateView
和mixin。
DetailView
这是将只读(禁用)字段添加到表单的方法:
class TaskUpdateView(UpdateView):
template_name='task_detail.html'
model = Task
form_class = TaskForm
# you can use the line below instead of defining form_class to generate a model form automatically
# fields = ('status', )
def form_valid(self, form):
post = form.save(commit=False)
# do anything here before you commit the save
post.save()
# or instead of two lines above, just do post = form.save()
return JsonResponse({'status':'updated...'})