Django: Как сделать поля не редактируемыми по умолчанию в встроенной модели Formet?

У меня есть встроенный модельный набор форм, и я хотел бы сделать поля не редактируемыми, если эти поля уже имеют значения при загрузке страницы. Если пользователь нажмет кнопку "Изменить" в этой строке, он станет доступен для редактирования и (используя JavaScript), я бы заменил исходные виджеты на редактируемые. Я бы хотел сделать что-то подобное при загрузке страницы:

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

Я вижу, что inlineformset_factory имеет аргумент formfield_callback. Я подозреваю, что это может быть полезно, но я так и не нашел для него никакой документации. Может ли кто-нибудь указать мне какую-нибудь полезную документацию для этого и как она может помочь мне решить эту проблему?

Ответ 1

Этот меня тоже немного насторожил. Надеюсь, это то, что вы ищете.

<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>

Ответ 2

Этот поток немного устарел, но для тех, кто ищет:

в виде:

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

"readonly" - это атрибут HTML, который делает форму неизменной. "disabled" - это класс CSS, поскольку вы хотите изменить стиль по умолчанию, а также упростить jQuery.

Чтобы сделать readonly входы, редактируемые при нажатии, вот пример jQuery:

$('input.disabled').click(function(){
    $(this).removeAttr('readonly').removeClass('disabled');
});

Ответ 3

Я думаю, что вы можете переопределить функцию init вашей формы, которая используется в наборе форм. Там вы можете проверить исходные_данные и динамически создавать свои формы, как вы надеетесь сделать. По крайней мере, это звучит правдоподобно в моей голове.

Ответ 4

У меня возник вопрос, где я хочу "Автоматическое создание полей формы", может найти решение для динамического создания форм, это может помочь:

Автоматическое создание полей формы для формы в django

Он не чист и, вероятно, лучший способ справиться с этим.

Как просто отправить данные как редактируемые (нормальные формы) из django и выполнить проверку значения с помощью javascript, используя javascript для переключения виджетов?