Я немного повеселился, изучая, как работают формы, и придумал несколько решений, просто ради черта.
Поскольку вы отключаете виджет, а не поле, насколько формаобеспокоен тем, что он всегда ничего не получает для fieldA, и это всегда будет неудачным.
Попытка чего-либо в методе clean () не поможет для недопустимых форм, поскольку данные clean()
предназначены для обработки.
Похоже, способ извлечения данных форм для отображения HTML равен * 1008.*, который является вызовом field.widget.value_from_datadict(POST, FILES, field_name)
, поэтому он всегда будет смотреть на ваши данные POST.
Так что я думаю, у вас есть несколько вариантов.Взломать request.POST
, взломать данные POST внутренней формы или взломать 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
Изучил некоторые интересные вещи здесь:) Надеюсь, это поможет.