假设我有以下模型:
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)。
