gpt4 book ai didi

python - FormWizard 中带有 MultiValueField 的外键字段与另一个外键

转载 作者:太空宇宙 更新时间:2023-11-03 19:26:42 24 4
gpt4 key购买 nike

我有一个带有外键的模型到另一个也有外键的模型。我正在使用 django 表单向导渲染它(尝试支持尽可能旧的 django 版本),这对 inlineformset 不友好。我希望用户在表单向导中输入模型和额外信息,并将其转换为正确的 pk 值(这样额外信息可以依赖于组合)我想知道解决此问题的最佳方法。

用代码进一步阐明。我有三个模型:

class Subject(models.Model):
title = models.CharField(...)
extra_info = models.CharField(...)

class Topic(models.Model):
title = models.CharField(...)
extra_info = models.CharField(...)
subject = models.ForeignKey(Subject)

class AwesomeThing(models.Model):
title = models.CharField(...)
topic = models.ForeignKey(Topic)

现在,我想在表单向导中将 AwesomThingtopic 字段作为四个字段呈现给用户:

  • 主题
  • 主题额外信息
  • 主题
  • 主题额外信息

我使用 MultiValueFieldMultiWidget 来完成此操作,但我不确定保留值并在表单向导中的步骤之间传输值的最佳方法。我能够做到这一点,但我担心我的方法过于频繁地访问数据库。以下是我目前的做法:

class SubjectTopicField(MultiValueField):
widget = SubjectTopicInput # Multiwidget to present four input fields
hidden_widget = HiddenInput

def __init__(self, *args, **kwargs):
fields = (
CharField(label='Subject'),
CharField(label='Subject extra information'),
CharField(label='Topics'),
CharField(label='Topic extra information'),
)

super(SubjectTopicField, self).__init__(fields, *args, **kwargs)

def compress(self, data_list):
# If all four fields are present ...
if data_list and len(data_list) == 4:
# ... call and return the topic 'pk' value from a custom method that
# creates and/or gets the topic based on the subject and topic info
return get_or_create_topic(data_list[0], data_list[1], # Subject
data_list[2], data_list[3]) # Topic

return None

我的 get_or_create_topic 方法基本上只是查找主题和主题的组合是否存在,如果存在则返回它,如果不存在则创建它。问题是,这意味着它必须在每一步中都访问数据库。我看到该字段的隐藏字段表示仅保存值列表(data_list)而不是主题的 pk 值。我认为这不是最佳选择。有一个更好的方法吗?我可能只是专注于让它与 MultiValueField 一起使用,但我看不到执行此操作的正确方法。

最佳答案

我想我已经明白了这一点。答案是使用 MultiWidget 子类,但不要子类化 MultiValueField。我只是将主题字段指向继承 MultiWidget 的SubjectTopicInput,然后除了解压缩之外,我还对 value_from_datadict 进行子类化以返回 pk (我知道我可以使其更漂亮,但这正是我为获得它所做的事情)工作):

def value_from_datadict(self, data, files, name):
# Is there just a single value available which we can return?
single_value = data.get(name, None)
if single_value: return single_value

# No single value, let's try to find our topic (or create it)
super_value = super(SubjectTopicInput, self).value_from_datadict(data, files, name)
tc = get_or_create_topic(super_value[0], super_value[1],
super_value[2], super_value[3])

if tc: return tc.pk

return None

当你停止挖掘并质疑这个洞是否真的有必要时,这真的很容易。

关于python - FormWizard 中带有 MultiValueField 的外键字段与另一个外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7877678/

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