【发布时间】:2011-12-14 05:29:26
【问题描述】:
我有一个带有外键的模型到另一个也有外键的模型。我正在使用 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)
现在,我想在表单向导中将 AwesomThing 的 topic 字段作为四个字段呈现给用户:
- 主题
- 主题额外信息
- 主题
- 主题额外信息
我正在使用带有 MultiWidget 的 MultiValueField 来完成此操作,但我不确定保留值并在表单向导中的步骤之间传输它的最佳方法.我能够做到这一点,但我担心我的方法过于频繁地访问数据库。以下是我目前的做法:
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 一起工作,但我没有看到正确的方法。
【问题讨论】:
-
我想通了。由于声誉问题,我无法自行回答我的帖子,我将等待几个小时,然后再发布我的问题的答案。
标签: python django django-formwizard django-forms