与django在同一页面上的几个表单

时间:2016-09-12 10:18:00

标签: python django django-forms formset

我有一个非常简单的模型......这样的事情:

class MachineTransTable(models.Model):
    ...
    file = models.ForeignKey('File', related_name='the_file')
    source = models.TextField()
    target = models.TextField()
    ...

我想做的是创建一个页面,其中用户左侧有源(禁用),右侧是目标(可编辑),还有一个提交按钮,用于发布每个已编辑的目标文本MachineTransTable表中的选定对象。以下是一些更好地了解我的请求的信息:

  • 页面引用单个文件,MachineTransTable表中有多个(有时数百个)对象属于同一个文件
  • 每次用户编辑单个目标并点击该对象的提交按钮时,该对象将在DB中保存/更新(取决于对象的初始值),并且用户可以继续编辑所有其他目标对象...
  • 在页面的末尾有另一个提交按钮,用于在工作结束时退出页面(所有对象都已编辑/更新)。如果某个对象尚未编辑/更新,则会保留其原始值。

我尝试使用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

使用这种方法,我有一个表单,当点击提交按钮时,所有相关对象都会立即保存/更新...

如何实现上述目标?感谢

1 个答案:

答案 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!")