Найти - Пользователи
Полная версия: Доступ к функции модели при редактировании объекта модели через ModelForm
Начало » Django » Доступ к функции модели при редактировании объекта модели через ModelForm
1
Elaphe
Помогите, пожалуйста, понимаю, что вопрос плевый, но ответ найти не могу.
Есть модель, содержащая некоторую функцию:
class MyModel(models.Model):
Field1 = models.CharField(max_length=20)
Field2 = models.CharField(max_length=20)
def output_field(self):
    return '%s %s' % (self.field1, self.field2)

Есть форма, которая добавляет и редактирует объект модели. При этом в форму пользователь вводит не field1 и field2 по отдельности, а вместе. Затем, уже на уровне валидации поля, это поле разбивается с помощью split и в модель добавляются два поля. Примерный код формы:

class MyForm(forms.ModelForm):
	common_field = forms.CharField (max_length = 41) 
	class Meta(object):
		model = MyModel
		fields = ('common_field')
	def clean_common_field(self):
                #создаем field1 и field2
Потом эта форма используется в CreateView и все хорошо.
Но при редактировании формы возникают проблемы - поле common_field оказывается пустым, т. е. при редактировании пользователю нужно каждый раз заполнять поле заново. Надо добавить initial и использовать там функцию output_field. Пытаюсь изменить поле так:
common_field = forms.CharField (max_length = 41, initial = instance.output_field)
Получаю ошибку:
NameError: name ‘instance’ is not defined
Как сделать так, чтобы при редактировании формы в поле common_field подставлялось значение функции output_field?
FishHook
Elaphe
Как сделать так, чтобы при редактировании формы в поле common_field подставлялось значение функции output_field?
initial передается в  __init__ формы при создании объекта. Это словарь “название поля”: значение.
В CBV для этого есть специальный метод, что-то вроде get_initial или как-то так.
Elaphe
Спасибо, добрый человек! Все оказалось довольно просто:
class MyViewUpdate(generic.edit.UpdateView):
...
def get_initial(self):
		initial = super(MyViewUpdate, self).get_initial()
		initial['common_field'] = self.object.output_field
		return initial
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB