Admin/ADMINLIN中包含非模型字段的Django自定义窗体

2024-09-30 12:34:09 发布

您现在位置:Python中文网/ 问答频道 /正文

有点麻烦的Django或自定义页面的管理模式。在

我正在工作的网站将被用作数据存储实用程序,用于报告某些制造过程。数据库将有三个主表,其中两个表在第四个表中有一个ForeignKey。第四个表中的每一行基本上都是需要上载的CSV文件中的一行。第四个表的模型如下所示:

bandwidthrawid = models.IntegerField(...) 
testdate = models.DateTimeField(...)
frequency = models.FloatField(...)
power = models.FloatField(...)
uncalibratedpower = models.FloatField(...)

我让Django自动生成id字段。同一测试中的每个条目的测试日期都是静态的。Frequency、Power和uncalibrated Power字段都将包含来自CSV文件同一行的单个值。BandwidthRawId字段将按顺序包含整数,多次重复显示这是哪个特定测试。例如,假设一个用户对同一个模块进行两次测试,频率范围为1到60赫兹,步长为1赫兹,将生成一个CSV文件,该文件类似于:

^{pr2}$

第二个测试也将生成一个类似的文件。当这些文件上载到系统中时,测试日期将被记录,并将被分配一个带宽rawid,这是该列中当前最高值的递增值。因此,两个文件的表条目如下所示:

Id, Date, BWID, F, P, UP
1,  Date1, 1,   1, 0, 0
2,  Date1, 1,   2, 0, 0
...
60,  Date1, 1,   60, 0, 0
61,  Date2, 2,   1, 0, 0
62,  Date2, 2,   2, 0, 0
...
120,  Date2, 2,   60, 0, 0

这就是事情开始变得棘手的地方。有时文件的顺序不完全相同,因此CSV导入程序将无法工作。有时文件并不包含所有的信息。文件中从来没有日期,也没有任何标题行。为了解决所有这些问题,我创建了一个widget/field,它创建了一个CSV预览,并允许用户选择每个列所属的实际字段。我把这个叫CSVPreviewField。在

为了在“field”中测试这个字段/小部件,我重写了模型中的BandwidthRawID字段,并使用它来处理所有的处理。最初我认为重写该字段、进行处理,然后用正确的整数填充该字段,然后将其传递给处理是很容易的。不幸的是,这行不通。我得到的错误是BandwidthRawID字段的类型无效(在数据库中它是一个整数,在模型中是CSVPreviewField/FileInput)。在

接下来,我尝试将CSVPreviewField(称为BandwidthRawFile)添加到使用BandwidthRaw作为模型的ModelForm中,并重写了我为处理BandwidthRaw表而编写的ModelAdmin类的form字段。不幸的是,无论我做什么,我都不能显示这个字段,我得到的错误是“BandwidthRawFile在表单字段中找不到”或类似的错误。我还得到一个错误,它指示数据库中没有与“BandwidthRawFile”对应的列

之后,我学习了内联,并尝试用内联表单做同样的事情,但由于类似的原因也失败了。它失败的原因可能是我没有指定一个模型(希望我可以做一个自定义表单),模型不包含BandwidthRawFile字段,或者数据库不包含该字段。在

在这一点上,我已经做了两天,已经完全没有想法了。基本上,内联表单是最好的解决方案。如果我可以知道如何将我的小部件内联到另外两个需要带宽rawid的管理页面中,然后作为小部件处理的结果返回该值,这将是理想的情况。下一步我要做的就是把所有的自定义键都放回原处。在


Tags: 文件csvdjango模型数据库表单部件models
2条回答

既然看起来没人能回答这个问题,我就继续“回答”这个问题。在

我发现的答案是模型表单中不能有非模型字段。它们只是被框架忽略了。在内联中添加您自己的表单似乎也不能很好地工作,同样的错误最终会发生。在

我解决这个问题的方法是:

  1. 创建CSV预览小部件
  2. 在CSV字段中实现小部件
  3. 编写字段/小部件逻辑
  4. 创建我自己的表单而不是模型表单
  5. 创建表单处理程序
  6. 创建窗体的宿主视图
  7. 重写模型中的“添加”视图以返回自定义窗体
  8. 重写模型中的get_form函数,将csv小部件添加到表单中

我不太喜欢这个答案,但我没有更好的解决办法。在

如果您对实现不太挑剔,您可能需要查看类似PostgresForeign data wrappers(file_fdw是一个csv接口)。由于这些文件非常统一,因此您将获得一个不错的ORM接口,并且在导入方面省去了大量的麻烦。在

相关问题 更多 >

    热门问题