如何使用表单元字段中未指定的字段发布?

2024-04-24 01:25:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我只想将referenceData添加到class Meta字段并使用它,但是<select>的选项太多,所以我没有这样做,而是将reference字段添加到ModelForm中,然后读取该值引用的数据记录。但是,当POST完成时,只有referenceData字段丢失,并且创建了数据。你知道吗

你知道吗视图.py

    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)

你知道吗表单.py

    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工作和数据记录,但这是一种无法采用的方法。你知道吗

你知道吗型号.py

    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字段,以便可以隐藏许多字段。下面,我贴了一张该页面的快照。你知道吗

enter image description here

如您所见,如果用户单击数据列表中的一行,javascript将更新referenceData、reference和correctedText字段的值。用户完成并提交正确的文本。你知道吗

这就是问题所在。你知道吗

  1. 如果我像django表单字段那样使用referenceData字段,它在前端显示了太多的字段(大约100000行是不可选择的)。

  2. 所以我试着self.fields['referenceData'] = DataNeedsCorrection.objects.none(). 这可以有效地隐藏字段,但它不响应document.getElementById('id_referenceData').value = some_id,因为它没有选项值。所以我不能提交表格。


Tags: the数据selfformidtruedatareturn
1条回答
网友
1楼 · 发布于 2024-04-24 01:25:46

杰森。另一种方法是在表单的元类中包含所需的字段,并在表单的__init__方法中更改queryset。你知道吗

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',
            'correctedText',
        ]

    def __init__(self, *args, **kwargs):
        super(DataCorrectForm, self).__init__(*args, **kwargs)
        self.field['referenceData'].queryset = DataNeedsCorrection.objects.none()

如果这不符合你要找的让我知道(这样我可以删除它或提供另一个解决方案)。你知道吗

我建议的其他更改:

  • 您正在重写表单中的save方法,但没有执行任何新操作。我要把它去掉。

  • 删除the_form.clean()。这种情况发生在form.is_valid()

  • 我不确定IndexView是什么,但是如果它继承自FormView,那么整个post方法就不需要了。

  • Django已经提供了一个主键,因此您不需要添加AutoFields

相关问题 更多 >