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

如何在Django Admin中实现表单下拉选项的启用与禁用控制

实现方案

你需要把写死的下拉选项抽离成独立的可管理模型,再配合动态渲染下拉选项即可实现需求,完整步骤如下:

1. 新增奖金类型模型(models.py)

首先在你的应用models.py中添加如下模型,用来存储奖金选项的配置信息:

from django.db import models

class BonusType(models.Model):
    value = models.IntegerField(verbose_name="选项值", unique=True)
    name = models.CharField(verbose_name="选项名称", max_length=50)
    is_enabled = models.BooleanField(verbose_name="是否启用", default=True)
    sort_order = models.IntegerField(verbose_name="排序优先级", default=0)

    class Meta:
        verbose_name = "奖金类型配置"
        verbose_name_plural = verbose_name
        ordering = ["sort_order"]

    def __str__(self):
        return self.name

你可以直接在这个模型的后台管理页面对每个选项的启用状态、排序、名称进行修改。

2. 注册模型到Admin管理后台(admin.py)

修改你的admin.py,新增BonusType的注册:

from django.contrib import admin
from .models import Bonusrequest, BonusType
 
class adminPlus(admin.ModelAdmin):
    list_display = ("username","name","bonus","result","created","descrpt")

class BonusTypeAdmin(admin.ModelAdmin):
    list_display = ("value", "name", "is_enabled", "sort_order")
    list_editable = ("is_enabled", "sort_order") # 支持列表页直接快速修改启用状态

admin.site.register(Bonusrequest, adminPlus)
admin.site.register(BonusType, BonusTypeAdmin)

配置完成后你就能在Django Admin后台看到「奖金类型配置」的管理入口,直接勾选/取消勾选is_enabled字段即可控制选项是否在前端显示。

3. 视图层传递可用的奖金选项

修改渲染表单页的视图函数,查询所有启用的奖金选项传递到模板上下文:

from .models import BonusType

def your_form_view(request):
    # 其他原有逻辑
    enabled_bonuses = BonusType.objects.filter(is_enabled=True)
    return render(request, "你的模板路径.html", {"enabled_bonuses": enabled_bonuses})

4. 修改前端模板动态渲染下拉选项

把你原来写死的select部分替换为循环渲染的逻辑:

<div class="form-group">
    <label for="username">Username</label>
       <input type="text" placeholder='Username' class="form-control" name="username">
       <br>
       <label for="type">Bonus Türü</label>
            <select name="bonuses" id="test" class="form-control">
                  <option selected value="0">Please select</option>
                  {% for bonus in enabled_bonuses %}
                  <option value="{{ bonus.value }}">{{ bonus.name }}</option>
                  {% endfor %}
            </select>
</div>

注意:你原来的select标签写了两个重复的id属性,这里已经删除了多余的id='testvalue'。

可选补充:数据校验

如果你用了Django Form类,可以在表单的bonuses字段中动态设置choices,避免用户提交已禁用的选项:

from django import forms
from .models import BonusType

class BonusRequestForm(forms.ModelForm):
    bonuses = forms.ChoiceField(choices=[])

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["bonuses"].choices = [(bt.value, bt.name) for bt in BonusType.objects.filter(is_enabled=True)]
    
    class Meta:
        model = Bonusrequest
        fields = "__all__"

内容的提问来源于stack exchange,提问作者Elfo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:00:05