【问题标题】:several forms on the same page with django与 django 在同一页面上的几个表单
【发布时间】:2016-09-12 10:17:59
【问题描述】:

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

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

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

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

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

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

我可以做些什么来实现我上面描述的目标?谢谢

【问题讨论】:

  • 所以你有两种提交按钮,一种用于单个字段,另一种用于页面。现在你想让这个按钮工作吗?
  • 问题不是制作按钮...问题是如何拥有几个(最终数百个)表单...每个都有提交按钮...。我试图弄清楚如何用 django 做,但目前我不知道......页面按钮并不是一个真正的问题......我想通过一些编码我可以用 jquery 来做,但这不是我想做的。 .. 我更喜欢使用 django 提供服务器端解决方案。

标签: python django django-forms formset


【解决方案1】:

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

  • 你必须做很多重复的工作来写这么多的表格,而且很容易出错,而且很难维护。

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

但如果你真的想这样做,你可以使用 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!")

【讨论】:

  • 谢谢艾森,我不确定这就是我要找的……让我试着做一个非常低的水平……我正在寻找的是拥有一个正确的方法form.py 中的单个表单,它负责对象编辑/更新,一个 CBV,它提供所有不同的表单(每个表单都有其唯一的 ID)作为上下文中的列表和我在该列表上循环的模板。这样,我的页面中可以有多个表单,但没有重复并且 DRY 受到尊重......当然我可以使用你的建议(ajax 部分)来更新目标字段
  • 好的。经过几次测试,我意识到在同一页面中使用多个表单意味着每次更新表单时,我都需要重新加载整个页面......这不是一种有效的方法......在客户端工作要好得多jquery 并在需要时将每次更新发布到服务器......无需重新加载页面并且更好的用户体验
猜你喜欢
  • 2016-04-06
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多