A disabled field is not transmitted - workaround

I have a form with which I want to update a MyModel object. On the model, there is a single constraint of type fieldA together with field B. In the form in a pure method, I check this unique constraint.

For some reason, I have to show fieldA as soon as in the update. Thus, field A does not pass. My problem is that if the form is not validated, the form is re-displayed, but I lost the value in field A.

I tried reset cleaned_data ['fieldA'], but it does not work. Any idea what to change?

Forms.py

class MyModelUpdateForm(forms.ModelForm):
    class Meta:
        model = MyModel

    def __init__(self, *args, **kwargs):
        super(MyModelUpdateForm, self).__init__(*args, **kwargs)
        self.fields['fieldA'].widget.attrs['readonly'] = True
        self.fields['fieldA'].widget.attrs['disabled'] = True

    def clean(self):
        cleaned_data = self.cleaned_data
        fieldA= self.instance.fieldA
        fieldB = cleaned_data.get("fieldB")

        if MyModel.objects.filter(fieldA=fieldA, fieldB=fieldB).count() > 0:
            #try to reset fieldA, since it is not passed through, since it is disabled
            cleaned_data['fieldA'] = fieldA.pk #does not work
            raise forms.ValidationError('some unique validation error')
        return cleaned_data

Views.py:

myModelobject = get_object_or_404(MyModel.objects, pk=mymodel_id)

    if request.method == 'POST':
        model_form = MyModelUpdateForm(request.POST, instance=myModelobject )

        if model_form .is_valid():
           ....
+5
source share
6 answers

, , .

, , , fieldA .

- clean() , clean() .

, HTML field.data, field.widget.value_from_datadict(POST, FILES, field_name), POST.

, , . Hack request.POST, POST- value_from_datadict.


request.POST: , .

    myModelobject = get_object_or_404(MyModel.objects, pk=mymodel_id)

        if request.method == 'POST':
            POST = request.POST.copy()
            POST['fieldA'] = myModelobject.fieldA
            model_form = MyModelUpdateForm(POST, instance=myModelobject )

            if model_form .is_valid():
                # ...

:

def __init__(self, *args, **kwargs):
    super(MyModelUpdateForm, self).__init__(*args, **kwargs)
    self.data.update({ 'fieldA': self.instance.fieldA })

value_from_datadict: - , , ,

def __init__(self, *args, **kwargs):
    super(MyModelUpdateForm, self).__init__(*args, **kwargs)
    self.fields['fieldA'].widget.value_from_datadict = lambda *args: self.instance.first_name

:) , .

+12

:

class MyForm(forms.Form):

    MY_VALUE = 'SOMETHING'
    myfield = forms.CharField(
        initial=MY_VALUE,
        widget=forms.TextInput(attrs={'disabled': 'disabled'})

    def __init__(self, *args, **kwargs):

        # If the form has been submitted, populate the disabled field
        if 'data' in kwargs:
            data = kwargs['data'].copy()
            self.prefix = kwargs.get('prefix')
            data[self.add_prefix('myfield')] = MY_VALUE
            kwargs['data'] = data

        super(MyForm, self).__init__(*args, **kwargs) 

, , - . , ( ), , .

+1

jQuery , .

$('#my_form').submit(function(){
    $("#my_form :disabled").removeAttr('disabled');
});

SO

+1

, .

:

self.fields['fieldA'].widget.attrs['style'] = 'display:none;'

:

{{ form.fieldA.label_tag }}
{{ form.fieldA }}
{{ form.fieldA.value }}
{{ form.fieldA.errors }}

, A :

{{ form.fieldA.label_tag }}
{{ form.fieldA }}
{% for value, title in form.fields.fieldA.choices %}
    {% if value == form.fieldA.value %}
        {{ title }}
    {% endif %}
{% endfor %}
{{ form.fieldA.errors }}
0

​​, -, , , A forms.py ": ".

self.fields['fieldA'].widget.attrs['class'] = 'visibility_hidden_class'

form.fieldA ,

{{ form.fieldA.label_tag }}
{{ form.fieldA }}
<input type="text" value="{{ form.fieldA.value }}" disabled />

form.fieldA . form.fieldA.value.

0

, , dinamyc formset, , , , , , , JQuery JavaScript , , , . select2 , select2:

, id = "postForm" id id = "contractForm"

$('#postForm').click(function(e){
            e.preventDefault();
            $('select[id^="id_p_v"][id$="product"]').each(function(){
                // getIdNumber returns the digit value from id_field-n- in formset value
               // p_v was the prefix of fomset 
                var id = getIdNumber($(this).attr('id'));
                // I have an empty form for new forms so skip that one actually on send doesn't matter really. (form POST) but anyway skip
                if(id != null){
                    $(this).prop("disabled", false);
                }
            });
            $('#contractForm').submit();
          });
0

All Articles