Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django选择现有的相关记录,或创建新的内联记录_Python_Django_Django Models_Django Forms - Fatal编程技术网

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

Python Django选择现有的相关记录,或创建新的内联记录,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我有一个django模型“User”,带有一个相关模型“Group”的外键 我使用modelForm来呈现表单以创建用户,这允许用户从现有组的下拉列表中选择组 但是,如果用户在列表中找不到想要的组,我希望用户可以选择在该表单中创建一个“新”组 我知道我可以做一个内联表单,但我不确定如何在保留选择现有相关记录的能力的同时实现这一点 有什么建议吗?经过几个小时的研究,我找到了解决办法 我尝试了很多方法,包括在我的表单上重写clean()函数,但是这需要删除不变性,而且要正确进行验证非常麻烦 最终我的

我有一个django模型“User”,带有一个相关模型“Group”的外键

我使用modelForm来呈现表单以创建用户,这允许用户从现有组的下拉列表中选择组

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

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


有什么建议吗?

经过几个小时的研究,我找到了解决办法

我尝试了很多方法,包括在我的表单上重写clean()函数,但是这需要删除不变性,而且要正确进行验证非常麻烦

最终我的解决方案是如此的简单。在模型选择字段中,使用您的逻辑重写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')

听起来你在用Python搜索
get\u或\u create
方法。你能给我一些关于如何在表单中使用它的指导吗?如果用户正在创建“新”组,则需要提供组中的许多字段。选择现有组时,用户无需输入任何其他数据。这个答案怎么样?它似乎包含了您想要的所有内容。请给出一个更详细的代码示例,以及forms.py和views.py中的内容。我需要实现相同的东西,但我无法从上面的示例中理解。