Сохранять не все поля в UpdateView
Целый день бьюсь с решением одной проблемы. Имеется добавляющая форма:
class AddingForm(ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['fieldB'].required=False
class Meta:
model = Items
fields = ['fieldA', 'fieldB', 'date']
labels = {'fieldA': 'полеА:',
'fieldB': 'полеВ:',
'date': 'дата:'}
widgets = {
'fieldA': forms.TextInput(attrs={'class': 'form-control'}),
'fieldB': forms.TextInput(attrs={'class': 'form-control'}),
'date': forms.DateInput(format=('%Y-%m-%d'),
attrs={'type': 'date',
'class':'form-control'}),
}
И унаследованная от нее редактирующая форма:
class EditingForm(AddingForm):
set_new_date = forms.BooleanField(label="Новая дата?", required=False)
Как сделать так, чтобы дата, которую введет пользователь в поле 'date' на редактирующей форме сохранялось в БД только если стоит галочка в set_new_date? Если галочка не стоит в set_new_date, не важно какую дату введет пользователь, надо чтобы в БД она осталась неизменной (то есть какой была изначально).
Вот вьюшечка:
class Edit(UpdateView):
form_class = EditingForm
template_name = 'edit.html'
success_url = reverse_lazy('main')
def form_valid(self, form):
order = form.save(commit=False)
????
order.save()
return super().form_valid(form)
Пока что решила проблему следующим образом: forms.py:
class EditingForm(AddingForm):
set_new_date = forms.BooleanField(label="Новая дата?", required=False)
new_date = forms.CharField(label='Введи новую дату', required=False, widget=forms.DateInput(format=('%Y-%m-%d'),
attrs={'type': 'date', 'class':'form-control'}))
class Meta(AddinWordForm.Meta):
exclude = ('asking_date',)
views.py
class Edit(UpdateView):
form_class = EditingForm
template_name = 'edit.html'
success_url = reverse_lazy('main')
def form_valid(self, form):
order = form.save(commit=False)
if form.cleaned_data['set_new_date']:
order.date = form.cleaned_data['new_date']
order.save()
return super().form_valid(form)
И вроде все ОК полиморфизм, наследование. Но не слишком ли костыльно? Может какой-то более очевидный способ есть типа form[field].save = False или типа этого?
Велик соблазн не использовать никакие классы, а просто в функции представления руками прописать. Но как я поняла, так делать не нужно.
С другой стороны такие большие вьюхи - это же смешение логики отображения и бизнес логики.
Как сделать лучше, не говнокодово. Помогите пожалуйста