gpt4 book ai didi

django - django formset 中使用多个选择元素的动态模型选择字段

转载 作者:行者123 更新时间:2023-12-04 06:37:21 25 4
gpt4 key购买 nike

我在 django-users 列表上发布了这个问题,但那里还没有回复。

我有看起来像这样的模型:

class ProductGroup(models.Model):
name = models.CharField(max_length=10, primary_key=True)
def __unicode__(self): return self.name

class ProductRun(models.Model):
date = models.DateField(primary_key=True)
def __unicode__(self): return self.date.isoformat()

class CatalogItem(models.Model):
cid = models.CharField(max_length=25, primary_key=True)
group = models.ForeignKey(ProductGroup)
run = models.ForeignKey(ProductRun)
pnumber = models.IntegerField()
def __unicode__(self): return self.cid
class Meta:
unique_together = ('group', 'run', 'pnumber')

class Transaction(models.Model):
timestamp = models.DateTimeField()
user = models.ForeignKey(User)
item = models.ForeignKey(CatalogItem)
quantity = models.IntegerField()
price = models.FloatField()

假设大约有 10 个产品组和 10-20 个相关
ProductRuns 在任何给定的时间。每组有 20-200 个不同的
产品编号(pnumber),所以至少有几千个
目录项。

我正在为事务模型研究表单集。代替
包含数千个目录项的单一选择菜单
ForeignKey 字段,我想用三个下拉菜单代替
group、run 和 pnumber,它们唯一标识 CatalogItem。
我还想将后两个下拉列表中的选择限制为
当前可用的那些运行和 pnumber
选定的产品组(如果用户,我可以通过 AJAX 更新它们
更改产品组,但重要的是初始页面
在不依赖 AJAX 的情况下按描述加载)。

做到这一点的最佳方法是什么?

作为出发点,这是我迄今为止尝试/考虑的内容:

我的第一种方法是从项目中排除项目外键字段
表单,通过覆盖 add_fields 添加替代下拉列表
formset的方法,然后提取数据并填充
在保存模型实例之前手动添加字段。它是
简单明了,但它不是很可重用,我
不要认为这是执行此操作的正确方法。

我的第二种方法是创建一个新字段,它继承了两者
MultiValueField 和 ModelChoiceField,以及相应的
MultiWidget 子类。这似乎是正确的方法。作为
马尔科姆·特雷丁尼克把它放进去
a django-users discussion ,
“领域的‘智慧’在于 Field 类。”

我遇到的问题是何时/何地获取选择列表
从数据库。我现在拥有的代码是在 Field 的 __init__ 中完成的,
但这意味着我必须知道我在处理哪个产品组
在我什至可以定义 Form 类之前,因为我必须实例化
定义表单时的字段。所以我有一个工厂
从我的角度来看,我在最后一分钟调用的函数——在我知道之后
我拥有哪些 CatalogItems 以及它们属于哪个产品组
创建表单/表单集类并实例化它们。它有效,但我
想知道有没有更好的办法。毕竟,该领域应该是
能够在很久以后确定正确的选择,一旦它知道
其当前值。

另一个问题是我的实现限制了整个表单集
与(CatalogItems from)单个相关的交易
产品组。

我觉得有趣的第三种可能性是把它全部放在 Widget 中
类(class)。一旦我有了相关的模型实例,或 cid,或
无论给出什么小部件,我都可以获得 ProductGroup 和
构建下拉列表。这将解决我的问题
第二种方法,但似乎不是正确的方法。

最佳答案

在表单集中设置表单字段选择的一种方法是在表单的 __init__ 中。方法通过覆盖 self.fields['field_name'].choices ,但由于需要更动态的方法,以下是在 View 中起作用的方法:

from django.forms.models import modelformset_factory
user_choices = [(1, 'something'), (2, 'something_else')] # some basic choices
PurchaserChoiceFormSet = modelformset_factory(PurchaserChoice, form=PurchaserChoiceForm, extra=5, max_num=5)
my_formset = PurchaserChoiceFormSet(self.request.POST or None, queryset=worksheet_choices)

# and now for the magical for loop
for choice_form in my_formset:
choice_form.fields['model'].choices = user_choices

我无法找到答案,但尝试了一下,它在 Django 1.6.5 中有效。我想通了,因为 formsets 和 for 循环似乎很好地结合在一起:)

关于django - django formset 中使用多个选择元素的动态模型选择字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4702639/

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