【问题标题】:Dynamic queryset for foreignKey in Single Page Application with DjangoDjango单页应用程序中foreignKey的动态查询集
【发布时间】:2015-06-18 20:50:32
【问题描述】:

我有一个带有 AngularJs 和 Django 的单页应用程序。在我的主页上,我获得了加载页面时所需的所有表单。但是,有些字段是动态更新的。

假设我有

class Model1(models.Model):
    pass

class Model2(models.Model):
   model_1 = models.ForeignKey(Model1)

表格:

class Model2Form(forms.ModelForm):
    class Meta:
        model = Model2
        fields = ('model_1', )

我的 SPA 允许我创建 Model1 的实例(无需重新加载页面)。我知道如何过滤显示的选项并在选择字段中动态添加新实例但是这样做,当第一次呈现 html 时,在发生角度魔术并过滤可用选项之前,我得到了 django 制作的查询集,它是默认情况下 model.objects.all()。好吧,我不想显示这些。我试图在我的函数的 init 中添加:

self.fields['model_1'].queryset = Model1.objects.none()

当第一次呈现表单时,确实没有选项显示在选择字段中,但是,我无法验证我的表单,我收到错误:Select a valid choice. That choice is not one of the available choices.(显然,由于查询集,它没有可用的选项.none() )

我真的不想在调用时加载表单,而是在我的页面第一次加载时加载。有什么办法可以帮助我这样做吗?

干杯,伙计们, 继续摇摆

【问题讨论】:

    标签: angularjs django forms dynamicform


    【解决方案1】:

    您需要指定Model2model_1 字段可以为空,如下所示: Allow null in foreign key to user. Django

    model_1 = models.ForeignKey(Model1, null=True, blank=True, default = None)
    

    【讨论】:

    • 这可能很方便,但外键永远不应该为空!我觉得这是一个糟糕的解决方案。我错过了什么吗?
    • 这真的取决于你需要什么:如果你没有有效的选择,那么它必须是 Null !我从未尝试过,但它们可能是覆盖模型的构造函数__init__ 的选项,并在您知道某些model_2 可用时更改该字段的null 的值。另一种选择是让这些约束,并有一个明确的validate_model_1 函数,将在进行验证之前检查数据库。
    • 你的混合形式和模型。我找到了解决方案,我稍后会发布它
    • 表单验证部分源自模型中的描述。
    【解决方案2】:

    我知道如何处理这个问题。太傻了,我没有把问题的所有参数都给你。

    表单在加载时呈现,但当我验证它时,它会通过 CRUD 操作,此时会初始化一个 OTHER 表单,该表单将处理我发送的数据。因此,我可以根据一些额外的 kwargs 覆盖该(第二个)表单的 init 中的查询集,以区分我用于第一次渲染的表单和处理我的数据的表单。

    无需使任何字段为空或添加额外的验证。

    希望我已经足够清楚了。干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 2015-03-17
      相关资源
      最近更新 更多