You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:02:09