V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
seven777
V2EX  ›  Python

请教熟悉 Python Django 的老师们,关于 model field 的在 form 上自动显示的问题.

  •  1
     
  •   seven777 · 2018-08-15 17:51:07 +08:00 · 2251 次点击
    这是一个创建于 2317 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我是初学者,请老师们见谅,接触这一块也是工作需要.
    多谢各位!
    我设计了三个 model :
    class Unit(models.Model):  
      FName = ...
     ...
    class Goods(models.Model):
      FUnitID = models.ForeignKey(Unit,...)
     ...
    class SaleOrderEntry(models.Model):
      FGoodsID = models.ForeignKey(Goods,...)
      FUnitID = ???
     ...
    我的想法:
    在 SaleOrderEntry 这个表中,我需要一个 FUnitID 字段来存储 Goods (货物) 的计量单位(以 Unit 表主键形式存储),

    我希望实现:
    在 admin site 的 form 中,增加一个 SaleOrderEntry 实例时,"计量单位"是随着 Goods 字段的选择而自动出现,随之而改变的.
    而且自动显示的 Unit 是 name ,而不是 Autofield : id .

    我能想到的(我太菜了):
    我觉得 FUnitID 也应该定义成: FUnitID = models.ForeignKey(Unit,...)
    但怎么才能在 form 上实现"随着 Goods 字段的选择而自动出现"呢?
    请老师们帮忙.谢谢了.
    16 条回复    2018-08-16 17:12:15 +08:00
    mayorbryant
        1
    mayorbryant  
       2018-08-15 18:13:07 +08:00
    obj = SaleOrderEntry.objects.get(pk=pk)

    "计量单位" = obj. FGoodsID. FUnitID.FName
    ArianX
        2
    ArianX  
       2018-08-15 19:22:18 +08:00 via Android
    可以在 admin site 上增加一个自定义的字段,通过一楼那样的方式访问
    qq976739120
        3
    qq976739120  
       2018-08-16 00:01:53 +08:00
    我经历的两家公司都不用 form....
    twor
        4
    twor  
       2018-08-16 00:10:44 +08:00
    如果是我,我这样处理:

    class Goods(models.Model):
    ....def __str__(self):
    ........return self.name+self.FUnitID.FName

    (个人以为 admin 不用过于追去个性化,性价比太低;如果必须个性化,就自己写一个页面)
    twor
        5
    twor  
       2018-08-16 00:17:05 +08:00
    静态显示,但没按 save 按钮,不会动态变化

    class SaleOrderEntry(models.Model):
    ....def get_FName(self):
    ........return self.FGoodsID.FUnitID.FName
    ....get_FName.short_description = '计量单位'
    twor
        6
    twor  
       2018-08-16 00:27:29 +08:00
    4L 的设置,目的是新增 SaleOrderEntry 时有计量单位的提醒
    5L 的设置,目的是修改或查看时,显示计量单位提醒
    georgema1982
        7
    georgema1982  
       2018-08-16 07:00:15 +08:00
    首先你要先解释什么叫“随着 Goods 字段的选择而自动出现”。
    seven777
        8
    seven777  
    OP
       2018-08-16 08:48:46 +08:00
    @qq976739120
    老师,我的水平还处于没有分辨能力的阶段,:)
    不用 form?用 table?
    seven777
        9
    seven777  
    OP
       2018-08-16 08:51:34 +08:00
    @georgema1982
    老师好,我水平低啊,表达不清晰.

    选择 货物 自动带出 计量单位 ,数据表里村的是 Unit 的 id , 页面上显示的是 Unit 的 FName .
    seven777
        10
    seven777  
    OP
       2018-08-16 09:04:21 +08:00
    @twor
    谢谢老师.
    因为我刚开始学习 Django, 目的是想快速实现一个初级版本.
    我是想学习了解 admin 的实现方式,然后再自己做页面.
    刚开始,知识面捉襟见肘.
    我自己有几年传统 ERP 的实施和开发经历,也仅仅对这些技术有了解,仅仅对数据库的 CRUD ,触发器,约束,等等需要用到的知识有了解.
    本科是学财务的,看懂 python 和 django 的英文文档没问题,但也仅仅在看懂和理解,融会贯通还很远.
    也在网罗一些伙伴,但无奈,专业的瞧不起我现在的项目需求;不专业的又帮不上我.
    seven777
        11
    seven777  
    OP
       2018-08-16 09:16:37 +08:00
    @twor
    您给我的回复我马马虎虎看得懂,谢谢.
    您觉得像 SaleOrderEntry 这种单据表,还需要存 UnitID 这种字段吗? 每个 goods 对应的 unit 已经在 goods 表里有了.
    freakxx
        12
    freakxx  
       2018-08-16 09:59:21 +08:00
    这个的话,应该是要用 js 去做一个联动查询

    https://www.google.com/search?q=django%20admin%20js%20%E8%81%94%E5%8A%A8&safe=off&cad=h
    freakxx
        13
    freakxx  
       2018-08-16 10:03:58 +08:00
    随便打开一个链接,看下怎么处理 js 这一块

    到时 change 的时候,fiilter(goods=goods).first()就算了,试下
    seven777
        14
    seven777  
    OP
       2018-08-16 10:10:34 +08:00
    @freakxx 谢谢老师!!!
    twor
        15
    twor  
       2018-08-16 16:31:11 +08:00
    @seven777 如果你技术扎实,就按照 @freakxx 的搜索页面找找方案,我看了一下,的确能实现你说的效果
    如果那些文章有点吃力,就不要勉强了,先把整体做好,最后再雕琢这种提升体验的细节
    至于单位要不要单独弄个表,这个涉及到架构了,我也没什么好的建议,如果是我,可能会选 choices
    https://docs.djangoproject.com/en/2.1/ref/models/fields/
    seven777
        16
    seven777  
    OP
       2018-08-16 17:12:15 +08:00
    @twor 非常感谢!!!
    我接受而且非常赞同您的建议,"先把整体做好,最后再雕琢这种提升体验的细节".
    先把能做的做了再说,也许知识点在哪天就被覆盖了.
    thx v m
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3300 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:04 · PVG 20:04 · LAX 04:04 · JFK 07:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.