与 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。这里有一些更多信息可以更好地理解我的请求:
- 一个页面指的是一个文件,MachineTransTable 中有几个(有时是数百个)对象属于同一个文件table
- 每次用户编辑单个目标并点击该对象的提交按钮时,该对象在数据库中为 saved/updated(取决于对象的初始值)并且用户可以继续编辑所有其他对象...
- 页面末尾还有一个提交按钮,用于工作结束时退出页面(所有对象已edited/updated)。如果一个对象还没有 edited/updated,它会保持它的原始值。
我尝试使用表单集,但我想这不是正确的选择...这是文件 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!")
我有一个非常简单的模型...像这样:
class MachineTransTable(models.Model):
...
file = models.ForeignKey('File', related_name='the_file')
source = models.TextField()
target = models.TextField()
...
我想要做的是有一个页面,用户在左侧有源(禁用),右侧有目标 (editable) 和一个提交按钮 post MachineTransTable 中每个选定对象的已编辑目标文本 table。这里有一些更多信息可以更好地理解我的请求:
- 一个页面指的是一个文件,MachineTransTable 中有几个(有时是数百个)对象属于同一个文件table
- 每次用户编辑单个目标并点击该对象的提交按钮时,该对象在数据库中为 saved/updated(取决于对象的初始值)并且用户可以继续编辑所有其他对象...
- 页面末尾还有一个提交按钮,用于工作结束时退出页面(所有对象已edited/updated)。如果一个对象还没有 edited/updated,它会保持它的原始值。
我尝试使用表单集,但我想这不是正确的选择...这是文件 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!")