gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:37:27 25 4
gpt4 key购买 nike

假设我有以下模型:

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 , Troop2InactiveTroop , InactiveTroop2 .在创建模型时,我希望用户能够选择 Troop1Troop2 .如果模型将部队字段设置为 InactiveTroop2 , 我希望用户能够在 InactiveTroop2 之间进行选择, Troop1Troop2 .

我正在查看 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)。

关于python - 如何根据django中模型其他字段的状态修改字段渲染行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8812186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com