Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django自定义表单,在Admin/adminline中包含非模型字段_Python_Django_Django Models_Django Forms_Django Admin - Fatal编程技术网

Python Django自定义表单,在Admin/adminline中包含非模型字段

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

我在定制Django管理页面以使用自定义表单或非模型字段时遇到了一些问题

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

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界面,并在导入方面节省大量的麻烦。

由于似乎没有人对此有答案,我将继续“回答”它

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

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

  • 创建CSV预览小部件
  • 将小部件实现到CSV字段中
  • 编写字段/小部件逻辑
  • 创建我自己的表单--而不是模型表单
  • 创建表单处理程序
  • 创建视图以承载表单
  • 覆盖模型中的添加视图以返回自定义表单
  • 覆盖模型中的get_form函数,将csv小部件添加到表单中

  • 我真的不喜欢这个答案,但我没有更好的解决方案。

    这个问题包含了太多与制造过程和代词相关的细节,而与Django和widget相关的细节太少。问题还不清楚。例如,
    BandwidthRawId
    BandwidthRawId
    有何不同?这些字段根本没有区别。Django自动将SQL字段名更改为小写。不幸的是,我们的CSV文件根本不统一。如果这只是一个简单的一次性问题,我会做一些类似于您建议的事情,但这些文件每天都会生成,技术人员需要一个简单的界面将数据放入系统。