Django表单 - 动态更改查询集

时间:2016-12-10 19:18:39

标签: django django-forms

我有一个简单的模型:

class ModelA(models.Model):
    type = models.ForeignKey(Type)
    amount = models.DecimalField()
    product = models.ForeignKey(Product)

我已经为它创建了视图和模型表单

class ModelAForm(ModelForm):
    class Meta:
        model = ModelA
        fields = [
            'type', 'amount', 'product'
        ]

我该怎么做:

当用户在表单中选择'键入' - TYPE1然后在'产品'他有所有产品。它现在有效。

但是当用户选择TYPE2时,我想只用少量产品(例如年龄超过一年)向他展示

2 个答案:

答案 0 :(得分:0)

我会用js做这件事。选择第一个下拉列表后,根据所选值,我将触发一个ajax调用,仅从后端获取与选定值相关的内容,并更新产品的下拉列表。

Ajax适用于这种情况,因为它不会阻止浏览器中的其他操作并运行异步。

答案 1 :(得分:0)

  1. 您需要验证您的表单,因为即使您上传Ajax,任何人都可以使用您的表单代码向您发送任何类型和产品ID的组合。我不知道这对您来说很重要(您是否将订单存储为类型和产品的组合,并且您的产品与类型相关)。 要做到这一点:

    from django.utils.translations import ugettext_lazy as _
    
    class ModelAForm(ModelForm):
    
        # Your code here
    
        def clean(self):
            cleaned_data = super(ModelAForm, self).clean()
            product_type = cleaned_data.get("type")
            product = cleaned_data.get("product")
    
            if product.type != product_type:
                msg = _("Wrong product type.")
                self.add_error('product', msg)
    
  2. 如果您正在寻找动态表单字段,可以查找允许您创建动态表单,排序和过滤的django-select2库。例如,如果您在此类型中拥有10'000种产品,您的客户将如何从简单的Django表单中选择产品?