@@ -27,13 +27,13 @@ def fields_for_form(form, only_fields, exclude_fields):
27
27
return fields
28
28
29
29
30
- class BaseFormMutation (ClientIDMutation ):
30
+ class BaseDjangoFormMutation (ClientIDMutation ):
31
31
class Meta :
32
32
abstract = True
33
33
34
34
@classmethod
35
35
def mutate_and_get_payload (cls , root , info , ** input ):
36
- form = cls ._meta . form_class ( data = input )
36
+ form = cls .get_form ( root , info , ** input )
37
37
38
38
if form .is_valid ():
39
39
return cls .perform_mutate (form , info )
@@ -45,12 +45,28 @@ def mutate_and_get_payload(cls, root, info, **input):
45
45
46
46
return cls (errors = errors )
47
47
48
+ @classmethod
49
+ def get_form (cls , root , info , ** input ):
50
+ form_kwargs = cls .get_form_kwargs (root , info , ** input )
51
+ return cls ._meta .form_class (** form_kwargs )
52
+
53
+ @classmethod
54
+ def get_form_kwargs (cls , root , info , ** input ):
55
+ kwargs = {'data' : input }
56
+
57
+ pk = input .pop ('id' , None )
58
+ if pk :
59
+ instance = cls ._meta .model ._default_manager .get (pk = pk )
60
+ kwargs ['instance' ] = instance
61
+
62
+ return kwargs
63
+
48
64
49
- class FormMutationOptions (MutationOptions ):
65
+ class DjangoFormMutationOptions (MutationOptions ):
50
66
form_class = None
51
67
52
68
53
- class FormMutation ( BaseFormMutation ):
69
+ class DjangoFormMutation ( BaseDjangoFormMutation ):
54
70
class Meta :
55
71
abstract = True
56
72
@@ -67,7 +83,7 @@ def __init_subclass_with_meta__(cls, form_class=None,
67
83
input_fields = fields_for_form (form , only_fields , exclude_fields )
68
84
output_fields = fields_for_form (form , only_fields , exclude_fields )
69
85
70
- _meta = FormMutationOptions (cls )
86
+ _meta = DjangoFormMutationOptions (cls )
71
87
_meta .form_class = form_class
72
88
_meta .fields = yank_fields_from_attrs (
73
89
output_fields ,
@@ -78,20 +94,20 @@ def __init_subclass_with_meta__(cls, form_class=None,
78
94
input_fields ,
79
95
_as = InputField ,
80
96
)
81
- super (FormMutation , cls ).__init_subclass_with_meta__ (_meta = _meta , input_fields = input_fields , ** options )
97
+ super (DjangoFormMutation , cls ).__init_subclass_with_meta__ (_meta = _meta , input_fields = input_fields , ** options )
82
98
83
99
@classmethod
84
100
def perform_mutate (cls , form , info ):
85
101
form .save ()
86
102
return cls (errors = [])
87
103
88
104
89
- class ModelFormMutationOptions ( FormMutationOptions ):
105
+ class DjangoModelDjangoFormMutationOptions ( DjangoFormMutationOptions ):
90
106
model = None
91
107
return_field_name = None
92
108
93
109
94
- class ModelFormMutation ( BaseFormMutation ):
110
+ class DjangoModelFormMutation ( BaseDjangoFormMutation ):
95
111
class Meta :
96
112
abstract = True
97
113
@@ -102,13 +118,13 @@ def __init_subclass_with_meta__(cls, form_class=None, model=None, return_field_n
102
118
only_fields = (), exclude_fields = (), ** options ):
103
119
104
120
if not form_class :
105
- raise Exception ('form_class is required for ModelFormMutation ' )
121
+ raise Exception ('form_class is required for DjangoModelFormMutation ' )
106
122
107
123
if not model :
108
124
model = form_class ._meta .model
109
125
110
126
if not model :
111
- raise Exception ('model is required for ModelFormMutation ' )
127
+ raise Exception ('model is required for DjangoModelFormMutation ' )
112
128
113
129
form = form_class ()
114
130
input_fields = fields_for_form (form , only_fields , exclude_fields )
@@ -119,7 +135,7 @@ def __init_subclass_with_meta__(cls, form_class=None, model=None, return_field_n
119
135
output_fields = OrderedDict ()
120
136
output_fields [return_field_name ] = graphene .Field (model_type )
121
137
122
- _meta = ModelFormMutationOptions (cls )
138
+ _meta = DjangoModelDjangoFormMutationOptions (cls )
123
139
_meta .form_class = form_class
124
140
_meta .model = model
125
141
_meta .return_field_name = return_field_name
@@ -132,7 +148,7 @@ def __init_subclass_with_meta__(cls, form_class=None, model=None, return_field_n
132
148
input_fields ,
133
149
_as = InputField ,
134
150
)
135
- super (ModelFormMutation , cls ).__init_subclass_with_meta__ (_meta = _meta , input_fields = input_fields , ** options )
151
+ super (DjangoModelFormMutation , cls ).__init_subclass_with_meta__ (_meta = _meta , input_fields = input_fields , ** options )
136
152
137
153
@classmethod
138
154
def perform_mutate (cls , form , info ):
0 commit comments