我只想将referenceData
添加到class Meta
字段并使用它,但是<select>
的选项太多,所以我没有这样做,而是将reference
字段添加到ModelForm
中,然后读取该值引用的数据记录。但是,当POST完成时,只有referenceData
字段丢失,并且创建了数据。你知道吗
class CorrectView(IndexView):
...
form_class = DataCorrectForm
...
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST or None)
if form.is_valid():
the_form = form.save(commit=False)
the_form.clean() # HERE !
the_form.save() # HERE !
return self.form_valid(form)
else:
return self.form_invalid(form)
class DataCorrectForm(forms.ModelForm):
reference = forms.IntegerField()
def clean(self):
cleaned_data = super(DataCorrectForm, self).clean()
cleaned_data['referenceData'] = DataNeedsCorrection.objects.get(data_id=cleaned_data['reference'])
# I extract a record that matches data_id and assign it to the form data
return cleaned_data
def save(self, commit=True):
return super(DataCorrectForm, self).save(commit=commit)
class Meta:
model = DataCorrected
fields = [
'reference',
# 'referenceData', # If I comment this out it works! but not that I wanted
'correctedText',
]
如果我将'referenceData'
注释掉,至少可以正确创建POST工作和数据记录,但这是一种无法采用的方法。你知道吗
class DataCorrected(models.Model):
data_id = models.AutoField(primary_key=True)
referenceData = models.ForeignKey('DataNeedsCorrection', on_delete=models.CASCADE, null=True)
correctedText = models.CharField(max_length=300)
...
class DataNeedsCorrection(models.Model):
data_id = models.AutoField(primary_key=True)
category = models.ForeignKey('WatCategory', on_delete=models.CASCADE)
originalText = models.CharField(max_length=300)
translatedText = models.CharField(max_length=300)
...
当前的DataCorrected模型是null = True
,但是请注意这是我测试它所做的。你知道吗
如果您能指出其他改进,我将不胜感激。谢谢你的阅读。你知道吗
我将self.fields['referenceData']
更新为None
字段,以便可以隐藏许多字段。下面,我贴了一张该页面的快照。你知道吗
如您所见,如果用户单击数据列表中的一行,javascript将更新referenceData、reference和correctedText字段的值。用户完成并提交正确的文本。你知道吗
这就是问题所在。你知道吗
如果我像django表单字段那样使用referenceData
字段,它在前端显示了太多的字段(大约100000行是不可选择的)。
所以我试着self.fields['referenceData'] = DataNeedsCorrection.objects.none().
这可以有效地隐藏字段,但它不响应document.getElementById('id_referenceData').value = some_id
,因为它没有选项值。所以我不能提交表格。
杰森。另一种方法是在表单的元类中包含所需的字段,并在表单的
__init__
方法中更改queryset。你知道吗如果这不符合你要找的让我知道(这样我可以删除它或提供另一个解决方案)。你知道吗
我建议的其他更改:
您正在重写表单中的
save
方法,但没有执行任何新操作。我要把它去掉。删除
the_form.clean()
。这种情况发生在form.is_valid()
我不确定
IndexView
是什么,但是如果它继承自FormView
,那么整个post
方法就不需要了。Django已经提供了一个主键,因此您不需要添加AutoFields
相关问题 更多 >
编程相关推荐