小部件在两个字段中填充值
我知道如果我需要 django-admin 中的字段的自定义“选择器”,我需要创建一个自定义小部件。 但是,如果小部件必须生成两个值(例如 X 和 Y 坐标)怎么办?如何将它们填充到模型中的两个不同字段中?
I know that if I need a custom "selector" for a field in django-admin I need to create a custom widget.
But what if the widget have to produce two values, for example X and Y coordinates, how can I fill them in two different fields from the model?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您可以查看日期时间字段的实现,该字段在管理中呈现为 2 个字段。
自上而下,
管理员使用
它又使用
SplitDateTimeWidget
:它又扩展了您在
django.forms.widgets
中定义的MultiWidget
还应该延长。它有许多有用的方法,您可以覆盖它们。You can look at the implementation of the date-time field, that renders as 2 fields in the admin.
Going top-down,
the admin uses
which in turn uses
SplitDateTimeWidget
:Which in turn extends the
MultiWidget
defined indjango.forms.widgets
which you should also extend. It has many useful methods which you can override.Jannis Leidel 很久以前就发布了一个小部件。 django 坐标字段
据我记得,它从地图中获取坐标并将其传递给一个字段,然后一些 JavaScript 将其切成 2 个字段的 2 个坐标。
与自定义 表单 结合使用,它应该可以很好地工作出色地
Jannis Leidel released a widget quite a long time ago. django-coordinatesfield
As far as I remember, it took the coordinates from a map and passed it a single field and some javascript cut it into 2 coordinates for 2 fields.
Combined with a custom form it should work quite well
以下是 ModelForm 的示例:
http://www.adamalton.co .uk/blog/displaying-django-genericforeignkey-as-single-form-field/
在表单中添加一个额外的表单字段(对于您的单个小部件)并排除两个“真实”字段,然后覆盖 init并保存方法来执行使其工作的额外逻辑。
另外,同样的问题:
如何获取要设置的单个小部件Django 中有 2 个字段?
Here's an example for a ModelForm:
http://www.adamalton.co.uk/blog/displaying-django-genericforeignkey-as-single-form-field/
Add an extra form field to the form (for your single widget) and exclude the two 'real' fields, then override the init and save methods to do the extra logic that makes it work.
Also, same question:
How to get a single widget to set 2 fields in Django?
您可以使小部件呈现两个(隐藏)html 输入,其名称与需要填充的模型字段相关,并通过 javascript 为它们分配必要的值!
You can make the widget render two (hidden) html inputs, whose names relate to the model's fields that need to be filled and assign the necessary values via javascript to them!
我花了一些时间试图让 django 屈服于我的意愿,并意识到我对这个问题想得太多了。问题实际上不是用一个小部件设置两个字段,而是能够在同一页面上带有地图的表单上设置两个字段。那么问题就很简单了。假设您有一个从模型派生的表单,该模型具有“纬度”和“经度”两个字段。现在您需要做的就是在模板页面上放置一个地图来设置这些字段,并且可能会显示一个标记。例如,当您单击地图时。有几种方法可以做到这一点,但其中一种是:
当然这是一个非常简单的布局和实现,但我认为一旦你看到这根本不需要是一个 django 问题,而是一个更普遍的前端设计问题,很明显有一百万种方法可以做到这一点。由于这个原因,我没有在答案中放入任何 django 代码。就我个人而言,我使用的是脆脆的表单,它带有一个方便的
Layout
类,我将把地图 div 元素放在该Layout
中,而不是放在模板中。可能性是无限的。在我看来,django 小部件和表单的构建理念是“一个小部件 == 一个字段”,并且尝试将其偏离这一点可能比上述解决方案更加复杂。
I spent some time trying to bend django to my will on this and realised I was overthinking the problem. The issue really isn't setting two fields with one widget, it's just being able to set two fields on a form with a map on the same page. Then the problem is quite simple. Say you have a form derived from a model that has two fields 'latitude' and 'longitude'. Now all you need to do is put a map on the template page that sets those fields, and maybe displays a a marker. For example when you click the map. There are a few ways to do this but one would be:
Of course that's a very simple layout and implementation but I think that once you see this doesn't need to be a django problem at all but a more general front-end design problem, it becomes clear there are a million ways to do this. I haven't put any django code in the answer for that reason. Personally I'm using crispy forms, which comes with a handy
Layout
class and I'll be putting the map div element in thatLayout
rather than in the template. The possibilities are endless.It seems to me django widgets and forms are built with the idea that one widget == one field and trying to bend it away from that could be endlessly more complicated than the above solution.