我有一个非常简单的模型......这样的事情:
class MachineTransTable(models.Model):
...
file = models.ForeignKey('File', related_name='the_file')
source = models.TextField()
target = models.TextField()
...
我想做的是创建一个页面,其中用户左侧有源(禁用),右侧是目标(可编辑),还有一个提交按钮,用于发布每个已编辑的目标文本MachineTransTable表中的选定对象。以下是一些更好地了解我的请求的信息:
我尝试使用formset,但我猜它不是正确的选择...这是文件forms.py
class SegmentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(SegmentForm, self).__init__(*args, **kwargs)
if self.instance.id:
self.fields['source'].widget.attrs['readonly'] = True
class Meta:
model = MachineTransTable
fields = ['source','target',]
SegmentFormSet = inlineformset_factory(File, MachineTransTable, form=SegmentForm, fields=('source','target'), extra=0)
并且view.py文件是:
class CatUpdateView(LoginRequiredMixin,UpdateView):
Model = MachineTransTable
context_object_name = 'file'
template_name = 'app_cat/cat.html'
form_class = SegmentForm
...
def get_context_data(self, **kwargs):
context = super(CatUpdateView, self).get_context_data(**kwargs)
formset = SegmentFormSet(instance=self.get_object())
context['formset_Segment'] = formset
return context
使用这种方法,我有一个表单,当点击提交按钮时,所有相关对象都会立即保存/更新...
如何实现上述目标?感谢
答案 0 :(得分:0)
我认为你的选择是正确的,如果同一模型中的字段,你不应该在这里使用几个(最终数百个)表格。有两个原因:
你必须做很多重复工作才能写出这么多表格,这很容易犯错误而难以维持。
无论编辑了多少字段,您仍然需要连接数据库并更新记录,而且效率几乎都很高。
但是如果你真的想这样做,你可以使用Ajax将当前参数名称发布到api,然后更新它。例如,你有一个目标字段按钮:
<a href="api/table_id" class="button target">value_in_the_html</a>
使用Ajax发布字段名称和值:
$ajax({
url: "api/table_id",
type: "POST",
datatype: "json",
data: {"field": "target", "value": "value_in_the_html"}
});
在view.py中:
def UpdateTable(request, id):
field = request.POST.get("field", None)
value = request.POST.get("value", None)
machine = MachineTransTable.objects.filter(id=id).first()
machine.getattr(machine,field) = value
machine.save()
return HttpResponse("Saved!")