【问题标题】:Django select existing related record, or create new inlineDjango 选择现有的相关记录,或创建新的内联记录
【发布时间】:2017-12-24 22:35:40
【问题描述】:

我有一个 django 模型“用户”,其外键指向相关模型“组”。

我正在使用 modelForm 来呈现用于创建用户的表单,它允许用户从现有组的下拉列表中选择一个组。

但是,如果用户在列表中找不到他们想要的组,我希望用户可以在该表单中创建一个“新”组。

我知道我可以做一个内联表单,但我不确定如何在保留选择性地选择现有相关记录的能力的同时做到这一点。

有什么建议吗?

【问题讨论】:

  • 听起来你在 Python 中搜索 get_or_create 方法。
  • 你能给我一些关于如何在表单中使用它的指导吗?如果用户正在创建“新”组,则该组有许多需要提供的字段。而选择现有组,用户不需要输入任何其他数据。
  • stackoverflow.com/questions/22250352/… 这个答案怎么样?它似乎包括你想要的一切

标签: python django django-models django-forms


【解决方案1】:

经过几个小时的研究,我找到了解决方案。

我尝试了很多方法,包括在我的表单上重写 clean() 函数,但是这需要移除不变性并且很难正确进行验证。

最终我的解决方案是如此 sublcasss ModelChoiceField。在模型选择字段中,使用您的逻辑覆盖 to_python() 方法以创建相关对象(如果它不存在)。此外,我向该字段传递了一个查询集参数,以便在我的表单中我能够将新创建的对象仅传递给该表单实例,但不会显示在每个用户表单上。

class FlexibleModelChoiceField(ModelChoiceField):
    def __init__(self, queryset, *args, **kwargs):
        super(FlexibleModelChoiceField, self).__init__(queryset, *args, **kwargs)
        self.queryset = queryset

    def to_python(self, value):
        try:
            # Logic to get or create the model instance object
            return model_instance_object
        except (ValueError, self.queryset.model.DoesNotExist):
            raise ValidationError(self.error_messages['invalid_choice'], code='invalid_choice')

【讨论】:

  • 您能否提供一个更详细的代码示例以及forms.py 中的内容和views.py 中的内容。我需要实现相同的东西,但我无法从上面的例子中理解。
猜你喜欢
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 2014-09-21
  • 2016-05-17
  • 2015-06-01
相关资源
最近更新 更多