2

私はdjangoフォームを学んでおり、モデルフォームを生成して表示のみにする方法を知りたいです。

models.py

class Person(models.Model):
    first_name = models.CharField(max_length=40, null=True)
    last_name = models.CharField(max_length=40, null=True)
    #more fields

フォーム.py

class PersonForm(ModelForm):
    class Meta:
        model = Person

データベース内の既存のデータを使用してフォームを生成するには:

person=Person.objects.get(id=someid)
person_form = PersonForm(instance = person)

フォームのすべてのフィールドは、ページで編集可能です。ただし、データを表示したいだけです。

StackOverflow でいくつか検索した後、django ModelForm フィールドを uneditable として表示する方法と同様の解決策を見つけました。これは、個々のフィールドを uneidtableに設定する方法を教えています。

しかし、フォーム全体を編集不可にしたいのです。すべてのフィールドを 1 つずつ編集不可に設定する代わりに、これを行うより良い方法はありますか?

ご助力ありがとうございます。

更新:フロー コードがフォームを編集不可にするのに役立つことがわかりましたが、これが正しい方法であるかどうかはまだわかりません。

for field in person_form.fields:
            person_form.fields[field].widget.attrs['readonly'] = True

アドバイスをいただきありがとうございます。

4

4 に答える 4

1

おそらく別の解決策は、処理を行う必要がなく、このように表示するだけです..

<table border='1'>
    {% for field in form%}
        <tr>
            <td>{{field.label}}</td>
            <td>{{field.value}}</td>
        </tr>

    {% endfor%}

</table>
于 2013-07-09T03:49:34.957 に答える
1

editableフォームには、すべてのフィールドに作用する属性または同様のものはありません。したがって、フォーム レベルでこれを行うことはできません。

また、Fielddjangoフォームでも使用されるクラスにはそのような属性がないため、そのような属性を設定してフィールドを読み取り専用にすることはできません。そのため、フォームのフィールドで操作する必要が__init__あります。

class PersonForm(ModelForm):
    class Meta:
        model = Person

    def __init__(self, *args, **kwargs):
        super(PersonForm, self).__init__(*args, **kwargs)
        for name, field in self.fields.iteritems():
            field.widget.attrs['readonly'] = 'true'

一部のフィールドのみを編集不可にしたい場合は、__init__.

    def __init__(self, *args, **kwargs):
        super(PersonForm, self).__init__(*args, **kwargs)
        uneditable_fields = ['first_name', 'last_name']
        for field in uneditable_fields:
            self.fields[field].widget.attrs['readonly'] = 'true'
于 2013-07-08T09:14:07.933 に答える