如何在Django表单中查询数据库?

我有一个模型,我想为这个模型创建一个表单。

class Registration(models.Model):
    student_name = models.CharField(max_length=50)
    season = models.ForeignKey(Season, on_delete=models.CASCADE)
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE)
    address = models.TextField()

    class Meta:
        unique_together = (('student_name', 'selected_season', 'selected_subject'),)

我想为这个模型创建一个表单,让用户在表单中选择 subject 基于 season 他们选择的。我也有他们的模型。

class Subject(models.Model):
    subject_name = models.CharField(max_length=50)
    ...

class Season(models.Model):
    season = models.CharField(max_length=2, primary_key=True)
    subject = models.ManyToManyField(Subject)
    ...

我不知道如何查询表格。它应该是一个ModelForm还是一个普通的Form?如何在表单中查询数据库?

解决方案:

你只能在提交表单的时候知道选择了哪个季节,所以没有简单的直接方法来实现这个功能(注意这是HTTP的限制,不是django的限制)。 即你需要一个 “向导 “过程或者前端脚本。

“向导 “的解决方案是:一个第一表单,用户选择季节,用户提交表单,你的代码选择相关的科目,并显示第二个表单的科目选择,用户选择科目并提交进行最后的验证(注意:这通常是在一个单一的视图中完成的,使用一个表单隐藏字段来跟踪当前的步骤以及在第一步中选择了哪个季节)。这是保证工作的(当然,如果正确实现的话,xD),但并不是真正的用户友好。

第二个解决方案是使用前端脚本。

最简单的形式是,当用户选择季节时,你使用js来隐藏其他季节的主题(或者你先隐藏所有主题,只在选择季节时显示相关主题)。这可以很简单的做到,将某个季节的所有主题分组在同一个字段集(或者其他容器标签)中,id与季节的id相匹配,或者每个季节有一个不同的html “select”(名称相同但id不同)。当然你也可以把所有的主题都放在一个html select(或其他什么)中,保留一个season=>subject的前台(js)映射,然后从这个映射中更新你的select或其他东西。

这个解决方案可以在没有JS的情况下工作(在 “降级 “模式下)(你只需要确保主题选择器在默认情况下是可见的和活动的)。你必须在后端实现一个自定义的验证(参见django的表单文档),以确保主题与季节相匹配 (从来没有 相信前端验证,这只是用户友好的糖),所以在最坏的情况下,表单将无法验证。

现在,如果你有大量的季节和主题,你可能希望在用户选择季节时优先做一个ajax查询,并从这个查询的结果中填充主题选择器(以避免最初呈现一个巨大的选项列表),但这样一来,你就无法在没有JS的情况下使其工作了(这是否是一个问题取决于你的要求)。

EDIT

如果我按照表单向导选项,我需要创建两个表单,第一个表单只包含季节。

好吧,你可以用一个表单来做(通过一个参数来指定应该做什么),但使用两个表单确实更简单。

第2个表单将由其余的选项组成(除了季节),我说的对吗?那么第2个表单应该是modelform吗?

嗯,这就是modelform的意义,不是吗?

我如何在modelform的ModelChoiceField中放入一个queryset?我上网查了一下,但什么也找不到。

在您的表格中 __init__,你更新 self.fields["subject"].queryset 与您的过滤查询集。

重要的是请勿尝试触摸 self.fieldname – 这是类级的字段定义,所以改变它在生产中会有完全意想不到的结果(曾经来过,做过,而且调试起来相当有趣xD)。

说到这里,对于你的用例,我估计你最好使用简单的js过滤方案–它是最容易设置的–在后端是完全透明的,前端部分使用jQuery相当简单–,它对用户更友好,而且保证工作。

给TA打赏
共{{data.count}}人
人已打赏
解决方案

检查网站是HTTP还是HTTPS。

2022-5-13 11:00:31

解决方案

改变光标类型 - 材质界面扩展面板

2022-5-13 11:00:33

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索