与 django 在同一页面上的几种形式

several forms on the same page with django

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

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

我想要做的是有一个页面,用户在左侧有源(禁用),右侧有目标 (editable) 和一个提交按钮 post MachineTransTable 中每个选定对象的已编辑目标文本 table。这里有一些更多信息可以更好地理解我的请求:

我尝试使用表单集,但我想这不是正确的选择...这是文件 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

使用这种方法,我有一个表单,所有相关对象在点击提交按钮时立即 saved/updated...

我该怎么做才能实现上述目标?谢谢

我认为你的选择是正确的,如果字段在同一模型中,你不应该在这里使用几种(最终数百种)形式。有两个原因:

  • 写那么多表格需要重复做很多工作,容易出错,维护起来也很困难。

  • 无论编辑了多少字段,还是要连接数据库更新记录,效率差不多。

但如果你真的想这样做,你可以只使用Ajax将当前参数名称post更改为api,然后更新它,例如,你有目标字段按钮:

<a href="api/table_id" class="button target">value_in_the_html</a>

使用Ajax到post字段名称和值:

$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!")