Skip to main content
 首页 » 编程设计

python之如何根据django中模型其他字段的状态修改字段渲染行为

2025年05月04日32xiaohuochai

假设我有以下模型:

class ScoutBook(models.Model): 
       troop = models.ForeignKey('Dictionary', limit_choices_to={'type' : 'Troop'},  related_name='+', blank=True, null=True) 
 
class Dictionary(models.Model):  
     name = models.CharField(max_length=CHAR_FIELD_MAX_LEN, verbose_name="Nazwa") 
     active = models.BooleanField(verbose_name="Aktywny") 
     type = models.CharField(max_length=CHAR_FIELD_MAX_LEN, choices=DICTIONARY_CHOICES) 

我想实现以下逻辑:

创建 ScoutBook 时允许用户仅选择活跃的部队,而在编辑时允许选择活跃的部队或允许用户保持值不变(即使部队不活跃)。如果我使用 limit_choices_to = {..., 'active' = True} django admin 的组合框中不存在不活动的部队。

明确一点:假设这个系统中有四个部队:Troop1 , Troop2和 InactiveTroop , InactiveTroop2 .在创建模型时,我希望用户能够选择 Troop1和 Troop2 .如果模型将部队字段设置为 InactiveTroop2 , 我希望用户能够在 InactiveTroop2 之间进行选择, Troop1和 Troop2 .

我正在查看 django 表单 api,但没有找到明显的方法。此外,在我正在开发的应用程序中,会有很多这样的字段和很多这样的模型——所以解决方案必须是无痛的。我宁愿不为每个模型创建新的 Form 类。我将主要使用 django admin 来启用编辑数据库,以及一些只列出条目的只读 View 。

理想情况下,我想将这个功能封装在一些自定义字段中——但是字段可以在验证和保存阶段访问模型实例——所以我在生成表单域时无法访问它。

请您参考如下方法:

这听起来像是您想在表单中执行的操作,而不是在对象本身中执行的操作。创建一个 ModelForm 并覆盖 ModelChoiceField像这样:

from django import forms 
 
class ScoutBookForm(forms.ModelForm): 
    troop = forms.ModelChoiceField(queryset=Troop.objects.filter(active=True)) 
    class Meta: 
        model = ScoutBook 

您也可以override the clean method of ScoutBook以确保它永远不会与不活跃的部队一起保存,尽管这可能会产生一些意想不到的后果(例如,如果部队在过去的某个时候不活跃,您将无法在管理员中更新 ScoutBook)。