如何在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
相关产品推荐
相关产品推荐

