Django表单-动态更改查询集

Django表单-动态更改查询集,django,django-forms,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

我有一个简单的模型:

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'
        ]
我怎样才能做到这一点:

当表单中的用户选择“类型”-类型1时,则在“产品”中,他拥有所有产品。现在它可以工作了


但当用户选择TYPE2时,我只想在少数产品中向他展示(例如,一年前的产品)

我会用js来实现这一点。一旦选择了第一个下拉列表,根据所选的值,我将启动一个ajax调用,从后端仅获取与所选值相关的内容,并更新产品的下拉列表


Ajax适合这种情况,因为它不会阻止浏览器中的其他操作,而是异步运行

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

Ajax适合这种情况,因为它不会阻止浏览器中的其他操作,而是异步运行

  • 您需要验证表单,因为即使您进行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)
    
  • 如果您正在查找动态表单字段,则可以查找允许您创建动态表单、排序和筛选的库。例如,如果您有10000个此类产品,您的客户将如何从普通Django表单中选择产品

  • 您需要验证表单,因为即使您进行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)
    
  • 如果您正在查找动态表单字段,则可以查找允许您创建动态表单、排序和筛选的库。例如,如果您有10000个此类产品,您的客户将如何从普通Django表单中选择产品


  • 我想是的。但是如何将这个ajax调用与ModelForm连接起来。Ajax响应应包含纯“选择html”,但其值中是否包含产品id?会没事的?是的,很好。或者有更好的方法:通过ajax直接在前端过滤掉产品,只显示相关的产品。不需要对后端进行ajax调用,因为您在Template中有上下文中的所有产品。但是如何将这个ajax调用与ModelForm连接起来。Ajax响应应包含纯“选择html”,但其值中是否包含产品id?会没事的?是的,很好。或者有更好的方法:通过ajax直接在前端过滤掉产品,只显示相关的产品。不需要对后端进行ajax调用,因为您在模板中有上下文中的所有产品