Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >根据ModelChoiceField关系过滤django中表单中的ForeignKey选项

根据ModelChoiceField关系过滤django中表单中的ForeignKey选项
EN

Stack Overflow用户
提问于 2017-05-28 09:36:07
回答 1查看 545关注 0票数 0

在django项目中,我创建了三个模型类。类‘子主题’与类‘章节’有ForeignKey关系,'SAQ‘类与类’章节‘和类’子主题‘有ForeignKey关系。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#models.py

from django.db import models
class Chapter(models.Model):
    chapter_serial = models.IntegerField(null=False, help_text="Chapter No.")
    slug = models.SlugField(unique=True, blank=True)
    chapter_name = models.CharField(max_length=120)

    class Meta:
        ordering = ["chapter_serial"]

    def get_saq_list_url(self):
        return reverse("cms:saq_list", kwargs={"chap_slug":self.slug})

class Subtopic(models.Model):
    subtopic_serial = models.IntegerField(null=False)
    title = models.CharField(max_length=240)
    chapter = models.ForeignKey('Chapter', on_delete=models.CASCADE)

    class Meta:
        ordering = ["subtopic_serial"]

class SAQ(models.Model):
    question_serial = models.IntegerField(null=False)
    question = models.TextField()
    answer = models.TextField()
    chapter = models.ForeignKey('Chapter', on_delete=models.CASCADE)
    subtopic = models.ForeignKey('Subtopic', on_delete=models.CASCADE, null=True, blank=True)

    class Meta:
        ordering = ["question_serial"]

我尝试使用django ModelForm为“模型SAQ”创建表单,这样对于每个与特定章节实例相关联的'SAQ表单‘,模型'Subtopic’的选择字段将只包含该特定章节实例的那些子主题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#forms.py
from django import forms
from .models import SAQ

class SAQForm(forms.ModelForm):

    class Meta:
        model = SAQ
        fields = [
            'question_serial',
            'question',
            'answer',
            'important',
            'remarks',
            'subtopic',
        ]

创建表单的django视图函数如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.shortcuts import render, get_object_or_404, redirect
from .models import SAQ, Chapter, Subtopic
from .forms import SAQForm
from django.http import HttpResponseRedirect

def saq_create(request, chap_slug=None):
    chapter_instance = get_object_or_404(Chapter, slug=chap_slug)
    form = SAQForm(request.POST or None)
    if form.is_valid():
        instance = form.save(commit=False)
        instance.chapter = chapter_instance
        instance.save()
        return HttpResponseRedirect(chapter_instance.get_saq_list_url())
    context = {
        "form":form,
        "chapter_instance":chapter_instance,
    }
    return render(request, 'cms/saq_form.html', context)

使用此配置,表单中的“Subtopic”选项字段将显示所有章节实例的所有子主题。任何建议都会很有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-28 13:27:12

我建议重写表单init并传递章节实例,这样您就可以过滤子主题查询集了。

示例(未测试,可能包含键入):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#forms.py
from django import forms
from .models import SAQ

class SAQForm(forms.ModelForm):

    class Meta:
        model = SAQ
        fields = [
            'question_serial',
            'question',
            'answer',
            'important',
            'remarks',
            'subtopic',
        ]

    def __init__(self, chapter, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['subtopic'].queryset = \
            self.fields['subtopic'].queryset.filter(chapter=chapter)

然后,您的视图应该将章节实例传递给表单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
chapter_instance = get_object_or_404(Chapter, slug=chap_slug)
form = SAQForm(chapter_instance, request.POST or None)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44230164

复制
相关文章
Django中的关系映射
级联删除,例如员工表中一项数据是部门ID,部门ID是部门表的主键,如果是级联删除,当删除了部门A的时候,会把所有属于部门A的员工都给删除。
Yuou
2022/09/26
1.7K0
Django中的form表单校验
我在使用django的form组件时,发现在view函数中的`form.is_valid()`在form表单校验未通过的情况下,返回的仍然是True,最后发现还是form表单的问题,异常函数并没有传递给view函数
cywhat
2022/11/22
1.5K0
Django ModelChoiceField:修改过滤查询集 queryset的两种方法
Django Form类定义中有一个 ModelChoiceField  对应的是Model 的外键,queryset 是返回一个查询集对象
KEVINGUO_CN
2020/04/26
1.6K0
django orm 重点大全
1.最简单的跨表,查询外键表中符合主表条件的记录列表 #用户类型表 class User_typ(models.Model): name=models.CharField(max_length=32) #用户表 class User(models.Model): name=models.CharField(max_length=32) age=models.IntegerField(max(100)) type=models.ForeignKey(User_typ)
玩蛇的胖纸
2018/06/08
7970
django Foreignkey 之 on_delete
on_delete 指的是通过 ForeignKey 连接起来的当前对象被删除后,外键字段进行的操作。
卓越笔记
2023/02/18
2520
django-ForeignKey,OneToOneField,ManyToManyField
进入到django自带的related.py中,可以看到 1.ForeignKey 初始化的参数有: to, on_delete, related_name=None, related_query_name=None,limit_choices_to=None, parent_link=False, to_field=None, db_constraint=True, **kwargs 假设我们有: class Author(models.Model): author = models.Char
西西嘛呦
2020/08/26
7170
django_2
要求 修改数据库 Django shell 数据级联(一对多) 元信息 定义字段 模型过滤 创建对象4种方式 查询集 过滤器 获取单个对象 字段查询 时间 聚合函数 跨关系查询 F对象 Q对象 学习课程 1.修改数据库 ① 在settings中的DATABASES中进行修改 ‘ENGINE’: ‘django.db.backends.mysql’, ’NAME‘ : 数据库名字 ’USER‘: 用户名字 ’PASSWORD‘:密码 ’HOST‘: 主机 ’PORT‘: 端口号 注意:引号加不加“”都
以某
2023/03/07
3.6K0
django_2
函数和方法的区别「建议收藏」
limit_choices_to:屏蔽某些选项,只显示某些指定的选项。例如下面的,只让显示部门id是1001的
全栈程序员站长
2022/07/21
5000
函数和方法的区别「建议收藏」
django中ModelForm多表单组合的解决方案
django是Python语言快速实现web服务的大杀器,其开发效率可以非常的高!但因为秉承了语言的灵活性,django框架又太灵活,以至于想实现任何功能都有种“条条大路通罗马”的感觉。这么多种选择放在一起,如何分出高下?我想此时的场景下就两个标准:
陶辉
2019/06/21
3.4K0
Django学习之八:forms组件【对
    Handle (掌控)一个form是非常复杂的工程,需要做很多功能:不同的类型的数据要有不同的渲染;校验数据;获取检验后的干净数据,并将数据反序列化为相应数据类型如时间对象;保存传递给处理程序等等。Django的forms组件就完成了这些复杂的工作,提供方便的操作form的接口API给我们。
py3study
2020/01/20
2.2K0
多对多关系表的创建方式、forms组件
through_fields:指定第三张表中哪两个字段维护表与表之间的多对多关系(这里有先后顺序,外键建在谁那里就先写谁)
GH
2019/12/16
5.2K0
多对多关系表的创建方式、forms组件
django 1.8 官方文档翻译:2-1-1 模型语法
模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。通常,每个模型对应数据库中唯一的一张表。
ApacheCN_飞龙
2022/11/27
5K0
Django 学习笔记之模型高级用法(上)
前面有两篇文章简单介绍 Django 的模型,这一部分算是基础知识。我自己近期也总做了下总结,将花大概两篇的篇幅来分享下模型的一些高级用法。
猴哥yuri
2018/08/16
2K0
Django 学习笔记之模型(上)
上片文章讲解模板。你本文将讲解 “MTV” 中 M 层次,即模型层(数据存取层)。模型这内容比较多,我将其拆分为 3 个部分来讲解。同时,文章也配套了例子,你可以通过 阅读原文 来查看。
猴哥yuri
2018/08/16
1.8K0
Django之ForeignKey和ManyToManyField多表查询
多表查询是模型层的重要功能之一, Django提供了一套基于关联字段独特的解决方案.
菲宇
2022/12/21
1.8K0
点击加载更多

相似问题

不使用ModelChoiceField - ForeignKey保存的Django表单

10

在Django ForeignKey中过滤ModelchoiceField值时的空白结果

21

带有ModelChoiceField的表单上的Django ForeignKey消失

20

Django ModelChoiceField:根据url中的pk过滤对象

132

ModelChoiceField不显示ForeignKey选项

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文