gpt4 book ai didi

django - 禁用字段未通过 - 需要解决方法

转载 作者:行者123 更新时间:2023-12-03 21:15:09 24 4
gpt4 key购买 nike

我有一个表单,我想用它来更新 MyModel 对象。在模型上有一个 unique_together 约束,fieldA 和 fieldB。在 clean 方法的表单中,我检查了这个唯一约束。

由于某些原因,我必须在更新中将 fieldA 显示为只读。因此 fieldA 没有通过。我的问题是,如果表单未验证,则重新显示表单,但我丢失了 fieldA 中的值。

我试图重置cleaned_data['fieldA'],但它不起作用。
知道要改变什么吗?

表单.py

class MyModelUpdateForm(forms.ModelForm):
class Meta:
model = MyModel

def __init__(self, *args, **kwargs):
super(MyModelUpdateForm, self).__init__(*args, **kwargs)
self.fields['fieldA'].widget.attrs['readonly'] = True
self.fields['fieldA'].widget.attrs['disabled'] = True

def clean(self):
cleaned_data = self.cleaned_data
fieldA= self.instance.fieldA
fieldB = cleaned_data.get("fieldB")

if MyModel.objects.filter(fieldA=fieldA, fieldB=fieldB).count() > 0:
#try to reset fieldA, since it is not passed through, since it is disabled
cleaned_data['fieldA'] = fieldA.pk #does not work
raise forms.ValidationError('some unique validation error')
return cleaned_data

View .py:
myModelobject = get_object_or_404(MyModel.objects, pk=mymodel_id)

if request.method == 'POST':
model_form = MyModelUpdateForm(request.POST, instance=myModelobject )

if model_form .is_valid():
....

最佳答案

我在研究表单的工作原理时有一点乐趣,并提出了多种解决方案,只是为了解决这个问题。

由于您禁用了小部件而不是字段,因此就表单而言,它始终没有收到 fieldA 的任何信息,并且始终无法通过验证。

在 clean() 方法中尝试一些东西对无效表单没有帮助,因为 clean()数据用于处理。

看起来表单为 HTML 显示拉取数据的方式是 field.data ,这是对 field.widget.value_from_datadict(POST, FILES, field_name) 的调用所以它会一直查看你的 POST 数据。

所以我认为你有几个选择。黑客 request.POST , hack 内部表单 POST 数据,或 hack value_from_datadict .

黑客 request.POST : 直截了当,有道理。

    myModelobject = get_object_or_404(MyModel.objects, pk=mymodel_id)

if request.method == 'POST':
POST = request.POST.copy()
POST['fieldA'] = myModelobject.fieldA
model_form = MyModelUpdateForm(POST, instance=myModelobject )

if model_form .is_valid():
# ...

黑客内部字典:
def __init__(self, *args, **kwargs):
super(MyModelUpdateForm, self).__init__(*args, **kwargs)
self.data.update({ 'fieldA': self.instance.fieldA })

黑客 value_from_datadict : 有点可笑,但说明了你可以从挖掘源头中学到什么
def __init__(self, *args, **kwargs):
super(MyModelUpdateForm, self).__init__(*args, **kwargs)
self.fields['fieldA'].widget.value_from_datadict = lambda *args: self.instance.first_name

在这里学到了一些很酷的东西 :) 希望它有所帮助。

关于django - 禁用字段未通过 - 需要解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4662848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com