Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django: How do I make fields non-editable by default in an inline model formset?

I have an inline model formset, and I'd like to make fields non-editable if those fields already have values when the page is loaded. If the user clicks an "Edit" button on that row, it would become editable and (using JavaScript) I would replace the original widgets with editable ones. I'd like to do something like this when loading the page:

for field in form.fields:
    if field.value:
        # display as text
    else:
        # display as my standard editable widget for this field

I see that inlineformset_factory has an argument called formfield_callback. I suspect that this could be useful, but so for I haven't found any documentation for it. Can anyone point me to some useful documentation for this, and how it can help me solve this problem?

like image 620
Jeff Avatar asked Oct 14 '09 18:10

Jeff


2 Answers

This one stumped me for a bit too. Hopefully this is what you're looking for.

<TABLE>
    <form method="post" action=".">
        {{ formset.management_form }}
        {% for form in formset.forms %}
            {{ form.id }}
            <tr>
                <td>{{ form.FirstName }}</td> <!-- This is a normal, editable field -->
                <td>{{ form.instance.LastName }}</td> <!-- 'instance' is your actual Django model. LastName displays the text from the last name field -->
            </tr>
        {% endfor %}
    </form>
</TABLE>
like image 169
Aaron C. de Bruyn Avatar answered Nov 12 '22 16:11

Aaron C. de Bruyn


This thread is a bit old, but for anyone looking:

in the form:

myfield=forms.CharField( widget=forms.TextInput(attrs={'class':'disabled', 'readonly':'readonly'}))

The "readonly" is an HTML attribute that makes the form uneditable. "disabled" is a CSS class as you'll want to modify the default styling, also it makes the jQuery simpler.

To make readonly inputs editable when clicked, here's a jQuery example:

$('input.disabled').click(function(){
    $(this).removeAttr('readonly').removeClass('disabled');
});
like image 41
Rich Avatar answered Nov 12 '22 18:11

Rich