Django - 基于另一个字段过滤表单字段查询集

时间:2016-03-31 21:07:08

标签: django django-forms django-queryset

我有三种模式:书籍,语言和选项。有预定义的书籍集(Master和Margarita,The Rose of the Rose等)和语言(英语,德语,法语等)。每个Book实例都有一个预定义的Languages子集(ManyToMany关系)。选项模型包含Book字段(作为ForeignKey)和Languages字段(ManyToMany)。我想构建一个允许用户选择任何书籍的表单,并且(在选择之后)动态过滤语言queryset以仅显示与本书相关的子集。 Django有可能吗?

相关型号:

class Book (models.Model):
    title = models.CharField (max_length = 128)
    languages = models.ManyToManyField (Language, related_name = 'available_languages')

class Language (models.Model):
    name = models.CharField (max_length=64)
    abbreviation = models.CharField (max_length=4)

class Options (models.Model):
    book = models.ForeignKey (Book, help_text = 'Text', null = True, blank = True)
    languages = models.ManyToManyField (Language, related_name = 'languages', help_text = 'Languages')

2 个答案:

答案 0 :(得分:1)

您可以通过多种方式执行此操作,其中一种最简单的方法是使用django-smart-selects应用,如果您正在使用django admin,则可以非常好地集成。您所要做的就是install the app并更新您的模型:

from smart_selects.db_fields import ChainedManyToManyField


class Options (models.Model):
    book = models.ForeignKey(Book, help_text='Text', null=True, blank=True)
    languages = ChainedManyToManyField(Language, related_name='languages', help_text='Languages'
                                       chained_field="book",
                                       chained_model_field="languages")

答案 1 :(得分:0)

您可以通过AJAX进行制作。当用户选择一本书时,您可以在Django中调用您的视图的URL。

视图将生成一个用户选择的书籍ID的表单,然后它将只返回所需表单的html。然后,在ajax成功中,您将html表单放在您想要的位置。

相关问题