Python Django自定义表单,在Admin/adminline中包含非模型字段
我在定制Django管理页面以使用自定义表单或非模型字段时遇到了一些问题 我正在使用的站点将用作报告某些制造过程的数据存储实用程序。数据库将有三个主表,其中两个在第四个表中有一个ForeignKey。第四个表中的每一行本质上是需要上传的CSV文件中的一行。第四个表的模型如下所示:Python Django自定义表单,在Admin/adminline中包含非模型字段,python,django,django-models,django-forms,django-admin,Python,Django,Django Models,Django Forms,Django Admin,我在定制Django管理页面以使用自定义表单或非模型字段时遇到了一些问题 我正在使用的站点将用作报告某些制造过程的数据存储实用程序。数据库将有三个主表,其中两个在第四个表中有一个ForeignKey。第四个表中的每一行本质上是需要上传的CSV文件中的一行。第四个表的模型如下所示: bandwidthrawid = models.IntegerField(...) testdate = models.DateTimeField(...) frequency = models.FloatField
bandwidthrawid = models.IntegerField(...)
testdate = models.DateTimeField(...)
frequency = models.FloatField(...)
power = models.FloatField(...)
uncalibratedpower = models.FloatField(...)
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
我让Django自动生成id字段。同一测试的每个条目的测试日期都是静态的。频率、功率和未校准功率字段都将包含CSV文件同一行中的单个值。BandwidthRawId字段将按顺序包含整数,多次重复表示这是哪个特定测试。因此,例如,假设用户在1至60 Hz的频率范围内以1 Hz的步长对同一模块进行两次测试,将生成一个CSV文件,该文件类似于以下内容:
1,0,0
2,0,0
3,0,0
4,0,0
5,0,0
...
60,0,0
第二个测试还将生成一个类似的文件。当这些文件上传到系统中时,将记录测试日期,并为其分配带宽RAWID,该带宽RAWID是该列中当前最高值的递增值。因此,这两个文件的表条目如下所示:
bandwidthrawid = models.IntegerField(...)
testdate = models.DateTimeField(...)
frequency = models.FloatField(...)
power = models.FloatField(...)
uncalibratedpower = models.FloatField(...)
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导入器无法工作。有时这些文件并不包含所有正确的信息。这些文件中没有日期,也没有任何标题行。为了解决所有这些问题,我创建了一个小部件/字段,它创建了一个CSV预览,并允许用户选择每个列所属的实际字段。我称之为CSVPreviewField
为了在“field”中测试这个字段/小部件,我重写了模型中的BandwidthRawID字段,并使用它来处理所有的处理。最初我认为重写该字段,进行处理,然后用正确的整数填充该字段,然后将其传递给处理是很容易的。不幸的是,这不起作用。我得到的错误是BandwidthRawID字段的类型无效(在数据库中是整数,在模型中是CSVPreviewField/FileInput)
接下来,我尝试将CSVPreviewField(称为BandwidthRawFile)添加到使用BandwidthRaw作为模型的ModelForm中,并重写我编写的ModelAdmin类的form字段以处理bandwidth_raw表。不幸的是,无论我做什么,我都不能显示这个字段,我得到的错误是“在表单字段中找不到BandwidthRawFile”或类似的错误。我还得到一个错误,表明数据库中没有与“BandwidthRawFile”对应的列
在那之后,我学习了内联,并尝试用内联表单做同样的事情,但由于类似的原因,内联表单也失败了。要么它失败了,因为我没有指定模型(希望我可以做一个自定义表单),要么模型不包含BandwidthRawFile字段,要么数据库不包含该字段
在这一点上,我已经在这方面工作了两天,完全没有想法了。基本上,内联表单是最好的解决方案。如果我能知道如何将我的小部件内联到另外两个需要带宽rawid的管理页面中,然后作为小部件处理的结果返回该值,那将是理想的情况。现在我很乐意让外键旁边的绿色+启动一个定制表单,完成所有处理并返回带宽rawid 如果您对实现不太挑剔,您可能希望查看类似Postgres的内容(file_fdw是一个csv接口)。由于文件非常统一,您将获得一个很好的ORM界面,并在导入方面节省大量的麻烦。由于似乎没有人对此有答案,我将继续“回答”它 我发现的答案是,模型表单中不能有非模型字段。它们只是被框架忽略了。添加您自己的表单内联似乎也不太好,同样的错误最终也会发生 我解决这个问题的方法是:
我真的不喜欢这个答案,但我没有更好的解决方案。这个问题包含了太多与制造过程和代词相关的细节,而与Django和widget相关的细节太少。问题还不清楚。例如,
BandwidthRawId
与BandwidthRawId
有何不同?这些字段根本没有区别。Django自动将SQL字段名更改为小写。不幸的是,我们的CSV文件根本不统一。如果这只是一个简单的一次性问题,我会做一些类似于您建议的事情,但这些文件每天都会生成,技术人员需要一个简单的界面将数据放入系统。