1. ホーム
  2. django

[解決済み] Django のフォームフィールドの値をテンプレートに表示するには?

2023-06-05 13:35:27

質問

Eメールプロパティを持つフォームがあります。

を使用する場合 {{ form.email }} を使う場合、Django は入力タグの value 属性に以前の値をレンダリングしたままです。

<input type="text" id="id_email" maxlength="75" class="required"
       value="[email protected]" name="email">

私はinputタグを自分でレンダリングしたい(いくつかのJavaScriptコードとエラー発生時のエラークラスを追加するため)。例えば、これは私のテンプレートで、代わりに {{ form.email }} :

<input type="text" autocomplete="on" id="id_email" name="email"
       class="email {% if form.email.errors %} error {% endif %}">

しかし、これでは誤った値( [email protected] を表示することはできません。

テンプレートでフィールドの値を取得するにはどうすればよいですか?

どのように解決するのですか?

Jens が提案した解決策は正しいです。 しかし、モデルフォームを初期化する際に インスタンス (下の例) を使ってモデルフォームを初期化すると、django はデータを取り込みません。

def your_view(request):   
    if request.method == 'POST':
        form = UserDetailsForm(request.POST)
        if form.is_valid():
          # some code here   
        else:
          form = UserDetailsForm(instance=request.user)

そこで、初期データを投入するModelFormの基底クラスを自作してみました。

from django import forms 
class BaseModelForm(forms.ModelForm):
    """
    Subclass of `forms.ModelForm` that makes sure the initial values
    are present in the form data, so you don't have to send all old values
    for the form to actually validate.
    """
    def merge_from_initial(self):
        filt = lambda v: v not in self.data.keys()
        for field in filter(filt, getattr(self.Meta, 'fields', ())):
            self.data[field] = self.initial.get(field, None)

すると、シンプルなビューの例はこのようになります。

def your_view(request):   if request.method == 'POST':
    form = UserDetailsForm(request.POST)
    if form.is_valid():
      # some code here   
    else:
      form = UserDetailsForm(instance=request.user)
      form.merge_from_initial()