Django forms如何将视图中定义的变量设置为表单字段placeholder
报错原因
EditPageForm是类级别定义,类属性初始化时视图函数的topic参数还未生成,类定义阶段无法访问视图运行时才传入的变量,因此会触发topic未定义的错误。
实现方法
提供两种常用的可行方案:
方案1:重写表单构造方法(适合表单复用场景)
动态接收topic参数并设置placeholder,修改代码如下:
from django.shortcuts import render from django import forms from . import util class EditPageForm(forms.Form): title = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'})) # 重写构造方法接收topic参数 def __init__(self, *args, **kwargs): topic = kwargs.pop('topic', '') super().__init__(*args, **kwargs) self.fields['title'].widget.attrs['placeholder'] = topic def editpage(request, topic): return render(request, "encyclopedia/editpage.html", { "form": EditPageForm(topic=topic), "topic": topic })
方案2:视图内修改表单属性(适合单次使用场景)
不需要修改表单类定义,直接在视图实例化表单后修改属性,代码如下:
from django.shortcuts import render from django import forms from . import util class EditPageForm(forms.Form): title = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Replace this', 'class': 'form-control'})) def editpage(request, topic): form = EditPageForm() # 动态修改placeholder form.fields['title'].widget.attrs['placeholder'] = topic return render(request, "encyclopedia/editpage.html", { "form": form, "topic": topic })
两种方案都可以实现title字段的placeholder显示topic参数的需求。
内容的提问来源于stack exchange,提问作者cjuggler
相关产品推荐
相关产品推荐

