使用 django 表单保存新的外键

2023-11-26

我有两个模型:

class Studio(models.Model):
    name = models.CharField("Studio", max_length=30, unique=True)

class Film(models.Model):
    studio = models.ForeignKey(Studio, verbose_name="Studio")
    name = models.CharField("Film Name", max_length=30, unique=True)

我有一个电影表单,允许用户选择一个预先存在的工作室,或输入一个新的工作室:

class FilmForm(forms.Form):
    studio = forms.ModelChoiceField(Studio.objects, required=False)
    new_studio = forms.CharField(max_length=30, required=False, label = "New Studio Name")
    name = forms.CharField(max_length=30, label = "Film Name")

进行验证以确保 new_studio 名称尚不存在。如果用户输入一个new_studio,我想保存该工作室,然后保存新的Film。

form = FilmForm(request.POST) 
if form.is_valid(): # All validation rules pass
    std = Studio(name = form.cleaned_data['new_studio'])
    std.save()

但是如何将 Film 实例保存到全新的工作室 ID 下呢?我见过这个问题,但是如果我在电影模型和电影形式中有更多字段怎么办?如果我使用链接的答案,我必须输入每个字段:

studio = Studio.objects.get(name=request.POST['new_studio'])
newFilm=Film(name=form.name, studio=studio, field_one = form.field_one, field_two = form.field_two, etc.)

实施这个的正确方法是什么?


真的,你唯一的问题是你使用了标准Form代替ModelForm. Form没有save方法,因为它本质上不与任何东西相关(即它不知道要保存什么或保存到哪里)。

但是,如果您使用ModelForm您需要处理在表单中创建新工作室所涉及的所有逻辑。不过,这实际上更好,因为这样您就可以只使用表单而不必担心其他任何事情:表单包含正确保存自身所需的所有逻辑。

class FilmForm(forms.ModelForm):
    class Meta:
        model = Film

    # only need to define `new_studio`, other fields come automatically from model
    new_studio = forms.CharField(max_length=30, required=False, label = "New Studio Name")

    def __init__(self, *args, **kwargs):
        super(FilmForm, self).__init__(*args, **kwargs)
        # make `studio` not required, we'll check for one of `studio` or `new_studio` in the `clean` method
        self.fields['studio'].required = False

    def clean(self):
        studio = self.cleaned_data.get('studio')
        new_studio = self.cleaned_data.get('new_studio')
        if not studio and not new_studio:
            # neither was specified so raise an error to user
            raise forms.ValidationError('Must specify either Studio or New Studio!')
        elif not studio:
            # get/create `Studio` from `new_studio` and use it for `studio` field
            studio, created = Studio.objects.get_or_create(name=new_studio)
            self.cleaned_data['studio'] = studio

        return super(FilmForm, self).clean()

那么,在您看来,您所需要的只是:

if form.is_valid():
    form.save()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 django 表单保存新的外键 的相关文章

  • Django:ModelForm 管理员的当前用户 ID

    我想用当前用户过滤 ModelChoiceField 我找到了一个非常接近我想做的解决方案 但我不明白Django 如何在管理表单中获取当前用户 https stackoverflow com questions 2864955 djang
  • 避免 Django 中表单输入元素 ID 重复

    当一页上的两个表单具有相同名称的字段时 Django 将生成无效的 HTML
  • 如何在 Django 上发送重置密码电子邮件?

    在使用 Django 框架创建我的第一个网站的过程中 我遇到了一个小问题 目前还没有找到解决方案 因此 当用户想要重置他或她的密码时 我想向他 她发送一封重置邮件 到目前为止 我有这个 urls py from django contrib
  • Django:上传前调整图像大小

    我想调整图像大小 Pillow 在上传之前 我在下面编写了代码但不起作用 并得到错误 myapp list 处的属性错误 坚定的 请求方式 POST 请求网址 http 127 0 0 1 8000 myapp list http 127
  • Django 1.6:如何在视图中访问静态文件

    我已经尝试过解决方案here https stackoverflow com questions 11721818 django get the static files url in view这对我不起作用 我正在为 Python 创建一
  • 使用 PyCharm 分析 Django

    即使在开发环境中 我的应用程序也相当慢 所以我想找出是什么导致它变慢 以便我可以尝试修复它 我了解调试工具栏 根据它的报告 数据库查询和下载的源都不是问题 所以它一定是业务逻辑 但是 我无法使用 Django 服务器运行 PyCharm 分
  • Django - 删除图像编辑表单中的“当前”并将其替换为实际图像

    编辑具有图像字段的对象时 系统会向您显示当前图像路径和标准文件上传字段 我想要做的是能够用实际图像替换显示的路径 当前 pathtoimage jpg 我该怎么做 提前致谢 如果您正在谈论 Django 管理中的表单 您可以覆盖 Admin
  • Django 权限

    我希望在我的 Django 项目中拥有更细粒度的权限 但无法决定使用哪个应用程序 我所拥有的是这样的 class Item models Model name models CharField max length 64 unique Tr
  • Django-尝试使用 send_mail() 在 python shell 中发送电子邮件,但无法工作

    我正在尝试在 Django 项目中发送帐户激活链接 但它无法工作 所以我在 shell 中尝试了非常基本的 send mail 函数 看看它是否正在发送 在settin py中 AUTHENTICATION BACKENDS django
  • 将 VueJs 组件添加到 Django 模板中

    我正在开发一个 Django 网站 我希望将一些 Vue 组件 散布 到 Django 渲染的模板中 我正在单个存储库中工作 并使用 webpack 设置来创建我在 Django 模板中使用的 style js 包 我正在努力让功能按照我想
  • Django,按当前登录用户过滤多对多模型表单中呈现的集合

    我知道它就在那里 但我找不到它 所以我有一个 类别 模型和一个 书籍 模型 其中有多对多的 类别 在模型表单中创建新书时 所有类别都会呈现给用户以分配给该书 在这种情况下 我只希望当前用户创建的类别显示在该字段中 而不是所有类别 最好的方法
  • Django:如何在开发模式下 gzip 静态文件?

    我的 django contrib staticfiles 设置似乎没问题 因为所有静态文件都按预期提供 然而 例如 尽管我打开了 GZipMiddleware 但 static css 文件不会被压缩 供参考 我的视图 html 实际上确
  • 使用 GeoDjango 在坐标系之间进行转换

    我正在尝试将坐标信息添加到我的数据库中 添加django contrib gis支持我的应用程序 我正在写一个south数据迁移 从数据库中获取地址 并向 Google 询问坐标 到目前为止 我认为我最好的选择是使用geopy为了这 接下来
  • 将 JSON 字符串传递给 Django 模板

    我一直在用头撞墙 试图找出为什么我无法将从 Django 模型生成的 JSON 字符串传递到模板的 javascript 静态文件中 事实证明 问题不在模型级别 使用serializers serialize 在脚本本身中放入相同的字符串将
  • Django基于PK和另一个字段保存对象

    我正在尝试将 postgresql 中的分区表与 Django 安装一起使用 通过Google搜索主题 我发现Django本身不支持分区 所以我自己对表进行了分区 我根据第二个字段对表进行分区 该字段是另一个表上的外键 基本模型设置如下 c
  • Django Azure AD 集成

    我目前正在使用 Azure AD 将 SSO 集成到 Django 项目中 我目前正在使用该包 https github com leibowitz django azure ad auth https github com leibowi
  • 在 Celery 中,我如何运行一个任务,然后让该任务运行另一个任务,并保持下去?

    tasks py from celery task import Task class Randomer Task def run self kwargs run Randomer again return random randrange
  • 如何在 Django QuerySets 中编写别名?

    如何为 django 查询集中的列名编写别名 对于两个链接字段与同一外部模型的联合式组合 例如 非常有用 例如在 mysql 中 select m as n b as a from xyz 我如何在 django 查询集中执行此操作 mod
  • 如何计算查询集中每个项目的两个字段的总和

    假设我有以下模型结构 class SomeModel Model base price DecimalField commision DecimalField 我不想存储total price在我的数据库中为了数据一致性并希望将其计算为ba
  • 我如何使用 F() 对象通过 Django ORM 来执行此操作?

    我遇到过这样的模型 class Task models Model timespan models IntegerField null True blank True class Todo models Model limitdate mo

随机推荐

  • 如何让 Maven 2 构建 2 个独立的 WAR 文件

    当做一个mvn install我想在我的目标目录中得到 2 个 WAR 文件 其中一个将包含生产 web xml另一个将包含test uat web xml 我试过这个
  • 我如何运行 Conda?

    我安装了 Anaconda 并且可以运行 Python 所以我假设我安装正确 按照此介绍性文档 我正在尝试安装 Python v3 3 因此我将以下行复制并粘贴到我的控制台中 conda create n py33 python 3 3 a
  • 将VC++的__try/__ except EXCEPTION_STACK_OVERFLOW移植到MinGW

    我正在尝试使用 VC 的 try except 语句将一些代码移植到 MinGW bool success true try except EXCEPTION STACK OVERFLOW GetExceptionCode EXCEPTIO
  • 通过 IdeaVim 在 IntelliJ 中使用 Vim 插件

    有没有办法通过 IdeaVim 在 IntelliJ 中使用 Vim 插件 在这种情况下 我正在寻找一种使用 easymotion Vim 插件的方法 您可以使用acejump插件或emacsIDEAs 不要被它的名字吓到 它只是介绍了 a
  • 使用 Pandas 从另一个数据帧中删除一个数据帧

    我有两个不同大小的数据框 df1 nad df2 我想从中删除df1存储在其中的所有行df2 所以如果我有df2等于 A B 0 wer 6 1 tyu 7 And df1等于 A B C 0 qwe 5 a 1 wer 6 s 2 wer
  • 删除R中tmap中的图例

    我有一个简单的问题 如何删除 R 中 tmap 中自动添加的图例 在这种情况下 我想删除右侧描述 级别 的图例 这是我尝试过的 tm shape densities polygons tm polygons col level palett
  • matlab:将向量划分为固定大小的重叠块

    我有一个向量 我想将其拆分为大小重叠的子向量cs轮流在sh 想象输入向量是 v 1 2 3 4 5 6 7 8 9 10 11 12 13 A 1 13 given a chunksize of 4 cs 4 和 2 sh 2 结果应如下所
  • 调用未定义函数curl_init()错误

    我在 Win 64 位操作系统 php 5 6 8 上使用 Eclipse PDT 来开发 PHP 我遇到过 Call to undefined function curl init 错误 我删除了 前extension php curl
  • D3D11:如何绘制简单的像素对齐线?

    我尝试用 D3D11 在两个顶点之间画一条线 我在 D3D9 和 D3D11 中有一些经验 但在 D3D11 中绘制一条线 从一个给定像素开始并以另一个像素结束 似乎是一个问题 我做了什么 我向每个顶点的像素坐标添加了 0 5f 以适应纹素
  • CakePHP如何通过ID数组获取多行

    我想根据 ID 数组列表从数据库中提取多行 在其他一些框架中似乎有类似 WHERE IN 的东西 但这里没有 有人可以告诉我该怎么做吗 我想知道如何通过 find 或 read 或任何其他 cakephp 函数 来做到这一点 而不是手动构建
  • Rails 库包括

    关于 lib 目录中定义的模块 我有一个令人费解的问题 我有两个文件 lib authentication rb module Authentication end lib test module rb module TestModule
  • HttpServlet 类与 Jersey 一起使用之间的混淆

    我正在构建实现 RESTful API 的 servlet 我知道 Jersey 是一个用于破译和使用给定 URL 的框架 我如何将它与HttpServlet class 我不明白两者如何相互合作 我想这是一个非常笼统的问题 但我已经阅读了
  • Python google Drive API下载,文件在哪里?

    我使用此处找到的 python 代码在谷歌驱动器上下载文件 https developers google com drive v3 web manage downloads我有这个范围 https www googleapis com a
  • GridView.scrollTo() 的解决方法?

    如上所述here Android的GridView scrollTo 不起作用 解决方案提到的方法 setSelectedPosition 似乎不存在于GridView smoothScrollToPosition确实有效 但我真的不想要动
  • pyqt qt4 QTableView如何禁用某些列的排序?

    所以我有一个 QTableView 我只想让列排序在第 1 列而不是第 2 列 自然地我尝试installEventFilter on QHeaderView or QTableView but MouseButtonPress事件不会被传
  • Rails link_to 方法: :delete

    我很抱歉问了一个可能是补救问题的问题 但在学习 Rails 时 我试图遵循本教程中的注释 http guides rubyonrails org getting started html 昨晚我在本教程中发布了一个类似的问题 并得到了及时的
  • Django 模板中的字典

    我有这样的看法 info dict u Question 1 13365 13344 u Question 2 13365 u Question 3 for key in info dict for k v in key items pro
  • JSON.NET 作为 WebAPI 2 OData 序列化器与 ODataMediaTypeFormatter

    我正在尝试使用 JSON NET 作为 WebAPI 2 堆栈中的默认序列化器 我已经实现了 JsonMediaTypeFormatter 其中使用 JSON NET 序列化器来序列化 反序列化数据 并创建了 JsonContentNego
  • Python Inspect.stack 很慢

    我只是在分析我的 Python 程序 看看为什么它看起来相当慢 我发现它的大部分运行时间都花在了inspect stack 方法 用于输出带有模块和行号的调试消息 每次调用 0 005 秒 这看起来相当高 是inspect stack真的这
  • 使用 django 表单保存新的外键

    我有两个模型 class Studio models Model name models CharField Studio max length 30 unique True class Film models Model studio m