Django选择现有的相关记录,或创建新的内联

时间:2017-07-19 14:54:22

标签: python django django-models django-forms

我有一个django模型'User',带有一个外键给相关模型'Group'。

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

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

我知道我可以使用内联表格,但我不知道如何在保留选择现有相关记录的能力的同时实现这一目标。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

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

我尝试了很多东西,包括覆盖我的表单上的clean()函数,但是这需要删除不变性并且使得验证变得混乱。

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

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')