From f0bd60c80412d6041922afddd550c653d03ab52d Mon Sep 17 00:00:00 2001 From: jamesrobb Date: Wed, 11 Mar 2015 17:16:33 +0000 Subject: [PATCH 1/4] added initial value to first name field to show expected behaviour --- examples/server/views/classic_subscribe.py | 3 +++ examples/server/views/client_validation.py | 3 +++ examples/server/views/combined_validation.py | 3 +++ examples/server/views/model_scope.py | 3 +++ examples/test.sqlite | Bin 0 -> 12288 bytes 5 files changed, 12 insertions(+) create mode 100644 examples/test.sqlite diff --git a/examples/server/views/classic_subscribe.py b/examples/server/views/classic_subscribe.py index 87e101b..e262a30 100644 --- a/examples/server/views/classic_subscribe.py +++ b/examples/server/views/classic_subscribe.py @@ -9,3 +9,6 @@ class SubscribeView(FormView): template_name = 'subscribe-form.html' form_class = SubscribeForm success_url = reverse_lazy('form_data_valid') + + def get_initial(self): + return {'first_name': 'james'} diff --git a/examples/server/views/client_validation.py b/examples/server/views/client_validation.py index 3c9985c..05cc551 100644 --- a/examples/server/views/client_validation.py +++ b/examples/server/views/client_validation.py @@ -9,3 +9,6 @@ class SubscribeView(FormView): template_name = 'client-validation.html' form_class = SubscribeForm success_url = reverse_lazy('form_data_valid') + + def get_initial(self): + return {'first_name': 'james'} diff --git a/examples/server/views/combined_validation.py b/examples/server/views/combined_validation.py index 8bed410..86c7c26 100644 --- a/examples/server/views/combined_validation.py +++ b/examples/server/views/combined_validation.py @@ -13,6 +13,9 @@ class SubscribeView(FormView): form_class = SubscribeForm success_url = reverse_lazy('form_data_valid') + def get_initial(self): + return {'first_name': 'james'} + def post(self, request, **kwargs): if request.is_ajax(): return self.ajax(request) diff --git a/examples/server/views/model_scope.py b/examples/server/views/model_scope.py index a3e0b4a..52979b5 100644 --- a/examples/server/views/model_scope.py +++ b/examples/server/views/model_scope.py @@ -13,6 +13,9 @@ class SubscribeView(FormView): form_class = SubscribeForm success_url = reverse_lazy('form_data_valid') + def get_initial(self): + return {'first_name': 'james'} + def post(self, request, **kwargs): if request.is_ajax(): return self.ajax(request) diff --git a/examples/test.sqlite b/examples/test.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..309207203ef06ad1dd22552b13b065fe1b6cb756 GIT binary patch literal 12288 zcmeI#zfXfe6bJCTHqpr+TSs4r1Ee)gG~GqR&`4=TIxsb7Iq^)PEu8N9C;BJ&mv|Uy zl*Y}e`M%_UyW>6J!}RWMeWfKmEQ?HNx?snQb9PC@7~^KN&8VZASEG)f*Y#TS%-Pw; z$$?pI9lo=pQ*%H-00Izz00bZa0SG_<0uX=z1pY-}(%S2EyFAw7ej&^C!nC)uQm&t6 zK5tIj*P-V|9!2hz?@{AkI~SSknM~(3=KGy~pTCK(n#q&M)8#BvX(6;)=H=Ex>sMWC zYu_T*D{p_1>=Z Date: Wed, 11 Mar 2015 17:33:48 +0000 Subject: [PATCH 2/4] added angular 1.3 and ng-model-options to fields to demonstrate issue --- examples/server/forms/subscribe_form.py | 5 +++++ examples/server/templates/base.html | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/server/forms/subscribe_form.py b/examples/server/forms/subscribe_form.py index 1cfafb7..839e0e4 100644 --- a/examples/server/forms/subscribe_form.py +++ b/examples/server/forms/subscribe_form.py @@ -54,3 +54,8 @@ class SubscribeForm(Bootstrap3Form): help_text='The password is "secret"') confirmation_key = forms.CharField(max_length=40, required=True, widget=forms.HiddenInput(), initial='hidden value') + + def get_widget_attrs(self, bound_field): + attrs = super(SubscribeForm, self).get_widget_attrs(bound_field) + attrs['ng-model-options'] = "{ debounce : { 'default' : 500, blur : 0 } }" + return attrs diff --git a/examples/server/templates/base.html b/examples/server/templates/base.html index c362a88..ea7b874 100644 --- a/examples/server/templates/base.html +++ b/examples/server/templates/base.html @@ -48,7 +48,8 @@
{% block container %}{% endblock %}
- + + {% block scripts %}{% endblock %} From 0b1e3feb1d8a4d026826b7bcada4de96961bc64a Mon Sep 17 00:00:00 2001 From: jamesrobb Date: Wed, 11 Mar 2015 20:38:25 +0000 Subject: [PATCH 3/4] implemented fix for #152 --- client/src/js/ng-django-forms.js | 48 ++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/client/src/js/ng-django-forms.js b/client/src/js/ng-django-forms.js index 357a3aa..68e1ed2 100644 --- a/client/src/js/ng-django-forms.js +++ b/client/src/js/ng-django-forms.js @@ -56,32 +56,32 @@ djng_forms_module.directive('djngError', function() { // Otherwise, the content of bound forms is not displayed, because AngularJS does not know about // the concept of bound forms and thus hides values preset by Django while rendering HTML. djng_forms_module.directive('ngModel', function() { - function restoreInputField(modelCtrl, field) { + function restoreInputField(field) { // restore the field's content from the rendered content of bound fields switch (field.type) { case 'radio': if (field.defaultChecked) { - modelCtrl.$setViewValue(field.defaultValue); + return field.defaultValue; } break; case 'checkbox': if (field.defaultChecked) { - modelCtrl.$setViewValue(true); + return true; } break; case 'password': // after an (un)successful submission, reset the password field - modelCtrl.$setViewValue(null); + return null; break; default: - if (field.defaultValue) { - modelCtrl.$setViewValue(field.defaultValue); + if(field.defaultValue) { + return field.defaultValue; } break; } } - function restoreSelectOptions(modelCtrl, field) { + function restoreSelectOptions(field) { var multivalues = []; angular.forEach(field.options, function(option) { if (option.defaultSelected) { @@ -90,19 +90,28 @@ djng_forms_module.directive('ngModel', function() { if (field.multiple) { multivalues.push(option.value); } else { - modelCtrl.$setViewValue(option.value); + return option.value; } } }); if (field.multiple) { - modelCtrl.$setViewValue(multivalues); + return multivalues; } } - - function restoreTextArea(modelCtrl, field) { - if (field.defaultValue) { - // restore the field's content from the rendered content of bound fields - modelCtrl.$setViewValue(field.defaultValue); + + function restoreTextArea(field) { + // restore the field's content from the rendered content of bound fields + if(field.defaultValue) { + return field.defaultValue; + } + } + + function setDefaultValue(modelCtrl, value) { + if(angular.isDefined(value)) { + modelCtrl.$setViewValue(value); + if(angular.isObject(modelCtrl.$options)) { + modelCtrl.$commitViewValue(); + } } } @@ -114,22 +123,25 @@ djng_forms_module.directive('ngModel', function() { link: function(scope, element, attrs, ctrls) { var field = angular.isElement(element) ? element[0] : null; var modelCtrl = ctrls[0], formCtrl = ctrls[1] || null; + if (!field || !formCtrl) - return; + return; + switch (field.tagName) { case 'INPUT': - restoreInputField(modelCtrl, field); + setDefaultValue(modelCtrl, restoreInputField(field)); break; case 'SELECT': - restoreSelectOptions(modelCtrl, field); + setDefaultValue(modelCtrl, restoreSelectOptions(field)); break; case 'TEXTAREA': - restoreTextArea(modelCtrl, field); + setDefaultValue(modelCtrl, restoreTextArea(field)); break; default: console.log('Unknown field type'); break; } + // restore the form's pristine state formCtrl.$setPristine(); } From 76d049f5d211b1c10a75636e95c3d452add7f284 Mon Sep 17 00:00:00 2001 From: jamesrobb Date: Wed, 11 Mar 2015 20:42:33 +0000 Subject: [PATCH 4/4] removed issue example code --- examples/server/forms/subscribe_form.py | 5 ----- examples/server/templates/base.html | 3 +-- examples/server/views/classic_subscribe.py | 3 --- examples/server/views/client_validation.py | 3 --- examples/server/views/combined_validation.py | 3 --- examples/server/views/model_scope.py | 3 --- 6 files changed, 1 insertion(+), 19 deletions(-) diff --git a/examples/server/forms/subscribe_form.py b/examples/server/forms/subscribe_form.py index 839e0e4..1cfafb7 100644 --- a/examples/server/forms/subscribe_form.py +++ b/examples/server/forms/subscribe_form.py @@ -54,8 +54,3 @@ class SubscribeForm(Bootstrap3Form): help_text='The password is "secret"') confirmation_key = forms.CharField(max_length=40, required=True, widget=forms.HiddenInput(), initial='hidden value') - - def get_widget_attrs(self, bound_field): - attrs = super(SubscribeForm, self).get_widget_attrs(bound_field) - attrs['ng-model-options'] = "{ debounce : { 'default' : 500, blur : 0 } }" - return attrs diff --git a/examples/server/templates/base.html b/examples/server/templates/base.html index ea7b874..c362a88 100644 --- a/examples/server/templates/base.html +++ b/examples/server/templates/base.html @@ -48,8 +48,7 @@
{% block container %}{% endblock %}
- - + {% block scripts %}{% endblock %}
diff --git a/examples/server/views/classic_subscribe.py b/examples/server/views/classic_subscribe.py index e262a30..87e101b 100644 --- a/examples/server/views/classic_subscribe.py +++ b/examples/server/views/classic_subscribe.py @@ -9,6 +9,3 @@ class SubscribeView(FormView): template_name = 'subscribe-form.html' form_class = SubscribeForm success_url = reverse_lazy('form_data_valid') - - def get_initial(self): - return {'first_name': 'james'} diff --git a/examples/server/views/client_validation.py b/examples/server/views/client_validation.py index 05cc551..3c9985c 100644 --- a/examples/server/views/client_validation.py +++ b/examples/server/views/client_validation.py @@ -9,6 +9,3 @@ class SubscribeView(FormView): template_name = 'client-validation.html' form_class = SubscribeForm success_url = reverse_lazy('form_data_valid') - - def get_initial(self): - return {'first_name': 'james'} diff --git a/examples/server/views/combined_validation.py b/examples/server/views/combined_validation.py index 86c7c26..8bed410 100644 --- a/examples/server/views/combined_validation.py +++ b/examples/server/views/combined_validation.py @@ -13,9 +13,6 @@ class SubscribeView(FormView): form_class = SubscribeForm success_url = reverse_lazy('form_data_valid') - def get_initial(self): - return {'first_name': 'james'} - def post(self, request, **kwargs): if request.is_ajax(): return self.ajax(request) diff --git a/examples/server/views/model_scope.py b/examples/server/views/model_scope.py index 52979b5..a3e0b4a 100644 --- a/examples/server/views/model_scope.py +++ b/examples/server/views/model_scope.py @@ -13,9 +13,6 @@ class SubscribeView(FormView): form_class = SubscribeForm success_url = reverse_lazy('form_data_valid') - def get_initial(self): - return {'first_name': 'james'} - def post(self, request, **kwargs): if request.is_ajax(): return self.ajax(request)