Django - 根据另一个字段过滤表单字段查询集
Django - filter form field queryset based on another field
我有三个模型:书籍、语言和选项。有预定义的书籍集(Master and Margarita、The Name of the Rose 等)和语言(英语、德语、法语等)。每个 Book 实例都有一个可用的预定义语言子集(多对多关系)。 Options 模型包含 Book 字段(作为 ForeignKey)和 Languages 字段(ManyToMany)。我想构建一个表单,允许用户 select 任何书籍,并且(在 selection 之后)动态过滤语言查询集以仅显示与本书相关的子集。 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')
您可以通过多种方式做到这一点,最简单的方法之一是使用 django-smart-selects app, which integrate very well specially if you're using django admin. All you have to do is to 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")
您可以通过 AJAX 完成。当用户选择一本书时,您在 Django 中调用视图的 url。
视图将创建一个带有用户所选图书 ID 的表单,然后它将 return 只有您想要的表单的 html。然后,在 ajax 成功中,您将 html 表单放在您想要的位置。
我有三个模型:书籍、语言和选项。有预定义的书籍集(Master and Margarita、The Name of the Rose 等)和语言(英语、德语、法语等)。每个 Book 实例都有一个可用的预定义语言子集(多对多关系)。 Options 模型包含 Book 字段(作为 ForeignKey)和 Languages 字段(ManyToMany)。我想构建一个表单,允许用户 select 任何书籍,并且(在 selection 之后)动态过滤语言查询集以仅显示与本书相关的子集。 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')
您可以通过多种方式做到这一点,最简单的方法之一是使用 django-smart-selects app, which integrate very well specially if you're using django admin. All you have to do is to 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")
您可以通过 AJAX 完成。当用户选择一本书时,您在 Django 中调用视图的 url。
视图将创建一个带有用户所选图书 ID 的表单,然后它将 return 只有您想要的表单的 html。然后,在 ajax 成功中,您将 html 表单放在您想要的位置。