如何在Django ModelFormSets中为Channel禁用复选框添加对应名称标签
问题描述
我有一个简单的Channel模型:
class Channel(models.Model): id = models.PositiveBigIntegerField(primary_key=True) name = models.CharField(max_length=100) disabled = models.BooleanField(default=False)
我希望用户能查看所有Channel(按名称展示),并选择启用或禁用它们。已实现部分功能,简化后的视图代码如下:
def channel_setup(request): ChannelFormSet = modelformset_factory( models.Channel, fields=['disabled'], edit_only=True ) formset = ChannelFormSet() context = { 'formset': formset } return render(request, "channel_setup.html", context)
目前视图会为每个Channel显示一个复选框,但所有复选框的标签都是“Disabled:”,无法区分对应哪个Channel。想在每个复选框旁显示对应Channel的name字段值,希望用Django原生方法实现,不想用JavaScript。
解决方案
方法一:自定义表单类动态设置标签
创建自定义ModelForm,在初始化时根据当前Channel实例的name字段修改复选框标签:
from django.forms import ModelForm class ChannelForm(ModelForm): class Meta: model = models.Channel fields = ['disabled'] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) if self.instance: self.fields['disabled'].label = self.instance.name
然后在视图中使用这个自定义表单生成表单集,同时传入queryset确保加载现有数据:
def channel_setup(request): ChannelFormSet = modelformset_factory( models.Channel, form=ChannelForm, edit_only=True ) formset = ChannelFormSet(queryset=models.Channel.objects.all().order_by('name')) context = { 'formset': formset } return render(request, "channel_setup.html", context)
方法二:在模板中手动渲染绑定名称
如果不想修改表单类,直接在模板里遍历表单集,手动将Channel名称和复选框绑定:
<form method="post"> {% csrf_token %} {{ formset.management_form }} {% for form in formset %} {{ form.id }} <label> {{ form.disabled }} {{ form.instance.name }} </label> <br> {% endfor %} <button type="submit">保存设置</button> </form>
内容的提问来源于stack exchange,提问作者Benjamin Gilbert
相关产品推荐
相关产品推荐

