从 ajax post 在 django 视图中创建多个对象

2024-01-01

我有以下模型: 对象 C,被对象 B 包含,被对象 A 包含

我在模板中有一个动态表单,并使用 jQuery 函数,我可以向该表单动态添加多个字段,每组字段代表对象(B 或 C)

当通过后期操作提交时,我想创建我的对象树。 我的目标是在验证此模板时创建一个对象树。

目前它有效,但我想我的解决方案真的很脏:

  • 根据我的表单中有多少元素,使用 js/jquery 创建列表
  • 使用 $.post 作为数据参数传递这些列表
  • 使用请求中的列表,在视图中的 django 数据模型中创建对象

我很确定有一个更好的解决方案:p

  • 使用多个帖子通过不同视图(A、B 和 C 不同)创建对象? (但是同步问题..)
  • 直接在 js/jquery 端使用 json 表示对象?
  • 另一个解决方案?

非常感谢 - 为了清晰起见进行了编辑

EDIT:

笔记 : 我这里的数据模型是不同的(我之前简化过) 所以 : 会话是以前的“对象 A” 锻炼是“对象B” 重复是“对象C” -抱歉,我希望它足够清楚(我会在最后一篇文章中纠正)

在你们的帮助下,这里取得了一些进展:) 我已经玩了一点 Form 和 FormSet。显然,它的功能强大:)

所以现在我有以下观点:

class RepetitionForm(forms.Form):
    weight = forms.CharField()
    count = forms.CharField()

def workoutForm(request):
    RepetitionFormSet = formset_factory(RepetitionForm, extra=1)

    if request.method == 'POST':
        repetitionFormSet = RepetitionFormSet(request.POST)

        user = get_object_or_404(User, pk=1)
        session = Session(date=datetime.date.today(), user=user)
        session.save()

        exerciseTypeRef = get_object_or_404(ExerciseTypeRef, pk=1)  
        exercise = Exercise(session = session, exerciseTypeRef = exerciseTypeRef)
        exercise.save()

        if repetitionFormSet.is_valid():
            for repetitionForm in repetitionFormSet.cleaned_data:
                if(repetitionForm.is_valid()):
                    weight = repetitionForm.data['weight']
                    count = repetitionForm.data['count']
        return HttpResponse("ok")
    else:
        repetitionFormSet = RepetitionFormSet()

    return render_to_response('workoutForm.html', {'formSet': repetitionFormSet}, context_instance=RequestContext(request))

模板面如下:

{% csrf_token %}
{{ formSet.management_form }}
<ul id="idUlFormSet">
{% for item in formSet %}
    <li>
    {{ item }}
    </li>
{% endfor %}

(模板中使用了更多代码来动态添加表单实例,正如这篇聪明的文章所描述的那样Django - 具有自动完成功能的 Javascript 动态内联 FormSet https://stackoverflow.com/questions/10315479/django-javascript-dynamic-inline-formset-with-autocomplete,这里就不解释了)

目前,在提交表单时,我从视图中收到此错误:

“在以下位置找不到关键‘权重’

如果我正在尝试

repetitionItem.isValid()

“RepetitionForm”对象没有属性“isValid”

如果我使用 forms.ModelForm 而不是 forms.Form,也会出现同样的问题

我很困惑:p

我的模特

class User(models.Model):
name = models.CharField(max_length=100)
mail = models.CharField(max_length=100)
dateCreated = models.DateTimeField('User creation date')
def __unicode__(self):
    return self.name


class Session(models.Model):
date = models.DateField('Session Date')
user = models.ForeignKey(User)
def __unicode__(self):
    return self.date.strftime("%Y/%m/%d")


class ExerciseTypeRef(models.Model):
name = models.CharField(max_length=100)
desc = models.CharField(max_length=300)
def __unicode__(self):
    return self.name


class Exercise(models.Model):
session = models.ForeignKey(Session)
exerciseTypeRef = models.ForeignKey(ExerciseTypeRef)
def __unicode__(self):
    return self.exerciseTypeRef.name

class Repetition(models.Model):
exercise = models.ForeignKey(Exercise)
count = models.IntegerField()
weight = models.IntegerField()

像这样为你的“A”模型制作一个模型表格。

class FormA(forms.ModelForm) :
    """Signup Form"""        
    class Meta :
        model = ObjectA

在你看来:

from django.forms.models import modelformset_factory
def form(request) :
    # Use Modelformset_factory and exclude the FK fields
    FormBSet = modelformset_factory(ObjectB, exclude=('objecta',))
    FormCSet = modelformset_factory(ObjectC, exclude=('objectb',))

    if request.method == "POST" :
        forma = FormA(request.POST, prefix="forma")
        formbset = FormBSet(request.POST, prefix="formbset")
        formcset = FormCSet(request.POST, prefix="formcset")
        if forma.is_valid() and formbset.is_valid() and formcset.is_valid() :
            # save a
            a = forma.save()

            # save a into b
            for formb in formbset:
                b = formb.save(commit=False)
                b.objecta = a
                b.save()

            # save b into c
            for formc in formcset:
                c = formc.save(commit=False)
                c.objectb = b
                c.save()

        ...
  1. 在视图中初始化 modelForms 时给它们一个前缀
  2. commit = False以便您可以保存上次保存操作生成的对象
  3. 使用表单集(https://docs.djangoproject.com/en/dev/topics/forms/formsets/#formsets)来管理 B 和 C 的 n* 个实例

EDIT

use from django.forms.models import modelformset_factory NOTformset_factory 还要注意排除参数。

see: https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#model-formsets https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#model-formsets

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

从 ajax post 在 django 视图中创建多个对象 的相关文章

随机推荐

  • 如何使用正则表达式来匹配名称?

    我是Python新手 我想编写一个正则表达式来进行一些名称检查 我的输入字符串可以包含 a z A Z 0 9 和 但应以 a z 或 A Z 开头 而不是 0 9 和 我想为此编写一个正则表达式 我尝试过 但没有什么是完美匹配的 一旦输入
  • iOS 应用程序因 cfrunloop_is_calling_out_to_an_observer_callback_function 而崩溃

    运行我的应用程序时 我偶尔会遇到此崩溃 它似乎与我的代码没有任何关系 它是什么以及我如何避免它 线程 0 名称 调度队列 com apple main thread 线程 0 崩溃 0 libsystem kernel dylib 0x00
  • 如何使用 .NET 代码从 Windows Phone Marketplace 获取我的应用程序的深层链接?

    如何以编程方式从 Windows Phone Marketplace 获取应用程序的深层链接 以便可以在代码中使用它 获取 AppDeeplink 非常有用 例如在 ShareStatusTask 和 ShareLinkTask 中 这是可
  • 将 XDocument 绑定到 WPF 并仍然使用 XPath?

    这是一个由 2 部分组成的问题 1 是否可以在不使用 ObjectDataProvider 的情况下将 XDocument 绑定到 WPF 控件 这是我的代码片段 其中 XmlDocument 可以工作 但我无法使用 XDocument X
  • 使用不同中间件的 Compojure 路由

    我目前正在使用 Compojure 以及 Ring 和相关中间件 在 Clojure 中编写 API 我正在尝试根据路线应用不同的身份验证代码 考虑以下代码 defroutes public routes GET public endpoi
  • 地球上所有 MimeType 的列表,映射到文件扩展名? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有列出现有所有 mimeType 的资源 我发现了一些地方的 mimeTypes 少于 1000 个
  • 使用 React hooks 防止 React 重新渲染 D3 图表

    我一直分别使用 React 和 D3 现在有一个项目 我需要对应用程序的绘图功能进行低级别控制 基本上 当用户放大绘图时 我需要能够从数据库中获取更高分辨率的数据 反之亦然 我找到了一些结合使用 D3 和 React 的方法 我想尝试让我的
  • ByRef 参数类型不匹配”错误 VB6

    我是 VB6 和 spread 的新手 我的 VB 项目正在使用 spread 在进行 spread 初始化的表单中 VB 6 会抛出一个编译错误 By Ref Argument Type Mismatch 错误 是否是因为 spread问
  • 在python中查找对某个对象的所有引用

    在 python 中查找对象的所有引用的好方法是什么 我问的原因是看起来我们有 内存泄漏 我们正在从网络浏览器将图像文件上传到服务器 每次执行此操作时 服务器上的内存使用量都会与刚刚上传的文件的大小成比例地增加 该内存永远不会被 pytho
  • C# process.start,如何知道进程是否结束?

    在 C 中 我可以使用以下命令启动一个进程 进程 启动 程序 exe 如何判断程序是否仍在运行 或者是否已关闭 MSDN 系统 诊断 流程 http msdn microsoft com en us library system diagn
  • 在验证 w3c 的 facebook 元标记中没有属性“property”

    我们可以使用meta name fb admins 代替meta property fb admins 用于 w3c 验证 我正在回答这个问题 尽管这是一个老问题 因为我认为这对于将来想要获得这方面信息的人来说是有价值的 当埃文说它不会通过
  • Yii2 - 制作超链接以在语言之间切换

    Hello 在 Yii1 1 中 我可以在 siteController 中执行操作 然后使用 Yii app gt controller gt createUrl actionname array language gt new lang
  • Fedora OpenJDK 设置 JAVA_HOME

    我正在使用 Fedora 实际上是 Pidora 因为我试图在树莓派集群上设置 hadoop 我使用 ansible 在所有节点上安装了 oopenjdk 但是 当我尝试设置 JAVA HOME 环境变量时 我对以下文件夹感到非常困惑 us
  • C 函数名还是函数指针? [复制]

    这个问题在这里已经有答案了 我们来看看这段代码 include
  • 路径相关类型是类型投影吗?

    我现在正在深入阅读Scala 以下是这本书的摘录 所有路径相关类型都是类型投影 路径依赖型foo Bar被重写 作为foo type Bar由编译器 在 Scala 中 所有类型引用都可以编写为针对命名实体的项目 类型 scala Stri
  • React 功能组件:如何使用 componentDidMount() [重复]

    这个问题在这里已经有答案了 我有一个函数 从技术上讲 它是一个 React 函数组件 export default function Daw return lt gt div Hello world div gt 当然 我的普通函数不能有R
  • 如何将用纯 python 动态创建的按钮添加到用 Kivy 语言编写的 kivy 布局中?

    我的问题是 我需要基于可变数量的网格方块创建按钮网格 并将它们放置在网格布局上 并使用屏幕管理器将它们显示在屏幕上 我知道如何使用简单的 for 循环在纯 python 中执行此操作 但是我用 kivy 语言编写了程序的布局 并且我不知道如
  • 关于http劫持和keep-alive

    i use resp err http Get http example com 得到一个http Response 我想准确地写入http处理程序 但只有http ResponseWriter 所以我劫持了它 webConn webBuf
  • R ggplot直方图条形按降序排列

    我不知道如何使用 ggplot 使直方图的条形按降序显示 这是我的代码 其中包含每个人都可以使用的数据框 library ggplot2 library scales chol lt read table url http assets d
  • 从 ajax post 在 django 视图中创建多个对象

    我有以下模型 对象 C 被对象 B 包含 被对象 A 包含 我在模板中有一个动态表单 并使用 jQuery 函数 我可以向该表单动态添加多个字段 每组字段代表对象 B 或 C 当通过后期操作提交时 我想创建我的对象树 我的目标是在验证此模板