6
6
from django .contrib .contenttypes .models import ContentType
7
7
from django .core .exceptions import ValidationError
8
8
from django .db import transaction , IntegrityError
9
- from django .db .models import Count , ProtectedError
9
+ from django .db .models import Count , ManyToManyField , ProtectedError
10
10
from django .db .models .query import QuerySet
11
11
from django .forms import CharField , Form , ModelMultipleChoiceField , MultipleHiddenInput , Textarea
12
12
from django .http import HttpResponse , HttpResponseServerError
@@ -650,7 +650,9 @@ def post(self, request, **kwargs):
650
650
if form .is_valid ():
651
651
652
652
custom_fields = form .custom_fields if hasattr (form , 'custom_fields' ) else []
653
- standard_fields = [field for field in form .fields if field not in custom_fields and field != 'pk' ]
653
+ standard_fields = [
654
+ field for field in form .fields if field not in custom_fields + ['pk' , 'add_tags' , 'remove_tags' ]
655
+ ]
654
656
nullified_fields = request .POST .getlist ('_nullify' )
655
657
656
658
try :
@@ -662,14 +664,24 @@ def post(self, request, **kwargs):
662
664
663
665
# Update standard fields. If a field is listed in _nullify, delete its value.
664
666
for name in standard_fields :
665
- if name in form .nullable_fields and name in nullified_fields and isinstance (form .cleaned_data [name ], QuerySet ):
666
- getattr (obj , name ).set ([])
667
- elif name in form .nullable_fields and name in nullified_fields :
668
- setattr (obj , name , '' if isinstance (form .fields [name ], CharField ) else None )
669
- elif isinstance (form .cleaned_data [name ], QuerySet ) and form .cleaned_data [name ]:
667
+
668
+ model_field = model ._meta .get_field (name )
669
+
670
+ # Handle nullification
671
+ if name in form .nullable_fields and name in nullified_fields :
672
+ if isinstance (model_field , ManyToManyField ):
673
+ getattr (obj , name ).set ([])
674
+ else :
675
+ setattr (obj , name , None if model_field .null else '' )
676
+
677
+ # ManyToManyFields
678
+ elif isinstance (model_field , ManyToManyField ):
670
679
getattr (obj , name ).set (form .cleaned_data [name ])
671
- elif form .cleaned_data [name ] not in (None , '' ) and not isinstance (form .cleaned_data [name ], QuerySet ):
680
+
681
+ # Normal fields
682
+ elif form .cleaned_data [name ] not in (None , '' ):
672
683
setattr (obj , name , form .cleaned_data [name ])
684
+
673
685
obj .full_clean ()
674
686
obj .save ()
675
687
0 commit comments