Сохранять не все поля в 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 или типа этого?

Велик соблазн не использовать никакие классы, а просто в функции представления руками прописать. Но как я поняла, так делать не нужно.

С другой стороны такие большие вьюхи - это же смешение логики отображения и бизнес логики.

Как сделать лучше, не говнокодово. Помогите пожалуйста

Вернуться на верх