【问题标题】:Django Foreignkey with edit fields and select field how to put in form带有编辑字段和选择字段的 Django Foreignkey 如何放入表单
【发布时间】:2020-02-01 07:56:39
【问题描述】:

如果之前有人提出过这个问题,我深表歉意。但是我已经为此苦苦挣扎了几个星期,找不到任何有用的东西。

我有以下问题(它被简化了很多,但本质上是我的问题)

我有一个包含很多字段的模型。这叫

class DocAide(models.Model):
    id = models.AutoField(primary_key=True)
    pulse = models.DecimalField('Pulse', max_digits=3, decimal_places=0)
    weight = models.DecimalField('Weight (kg)', max_digits=3, decimal_places=0)
    bp_sys = models.DecimalField('BP Sys', max_digits=3, decimal_places=0)
    bp_dia = models.DecimalField('BP Dia', max_digits=3, decimal_places=0)
    temperature = models.DecimalField('Temp. deg C', max_digits=2, decimal_places=1)
    drugs = models.ManyToManyField(Drug, blank=True)    
    date = models.DateField(editable=False, default=timezone.now)
    doctors_notes = models.TextField('Patient is complaining about:', default='')
    note = models.TextField(max_length=100, default='')

ForeignKey Drugs 有数量的药物名称我希望可以选择多种药物,但编辑字段显示需要服用的剂量和时间,它应该像处方。模型如下所示:

class Drug(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100, default='')
    QUANTITY_STR = ['Bottle', 'Tablet' 'Injection', 'Capsules', 'other']
    QUANTITY = ((str, str) for str in QUANTITY_STR)
    quantity = models.CharField(max_length=2, choices=QUANTITY, default='Bottle')
    category = models.CharField(max_length=150, default='')
    strength = models.CharField(max_length=150, default='')
    in_supply_stock = models.PositiveIntegerField(default=0)
    in_main_stock = models.PositiveIntegerField(default=0)
    date = models.DateField(editable=False, default=timezone.now)
    charge = models.PositiveIntegerField(default=0)
    morning = models.CharField(validators=[int_list_validator], max_length=3, default=0)
    midday = models.CharField(validators=[int_list_validator], max_length=3, default=0)
    evening = models.CharField(validators=[int_list_validator], max_length=3, default=0)
    night = models.CharField(validators=[int_list_validator], max_length=3, default=0)
    days = models.CharField(validators=[int_list_validator], max_length=3, default=0)
    tablets = models.CharField(validators=[int_list_validator], max_length=3, default=0)

如何在表单或模板中实现这一点。我尝试使用 Inlineformset 它不起作用。稍后我也想让它们预选。

但现在我想要一个按钮,它会生成一个带有药物下拉列表和模型编辑字段的行。

提前谢谢你。

【问题讨论】:

  • 在回答您的问题之前:drugs 是 ManyToMany field。你确定这是你想要的吗?您在谈论处方,我希望同一种药物在每个处方上的数量等不同。
  • ManyToMany 字段之所以被选中,是因为处方可以包含多种药物,例如对乙酰氨基酚和抗生素。

标签: django model-view-controller inline-formset


【解决方案1】:

正如其他人所说,Drug 对象不应该有与之关联的数量,但处方“条目”应该。

我认为这是您需要的模型结构:

QUANTITY_STR = ['Bottle', 'Tablet' 'Injection', 'Capsules', 'other']

class DocAide(models.Model):
    # same properties but remove `drugs` from this model


class Drug(models.Model):
    # same properties but remove `quantity` property


class Prescription(model.Model):
    drug = model.ForeignKey(to=Drug, related_name='prescriptions')
    doc_aide = model.ForeignKey(to=DocAide, related_name='prescriptions')
    quantity = models.IntegerField()
    qty_container = models.CharField(max_length=10, choices=QUANTITY_STR, default=QUANTITY_STR[0])

假设我正确理解了您的业务逻辑,我为您更改了一些内容。例如quantity 字段的工作原理。

我创建了两个字段来描述数量。 quantity 保存数值,qty_container 保存容器名称,如“瓶”、“注射”等。

qty_container 的max_length 等于单词“Injection”中的字符数,因为它是可能适合此字段的最大单词。您让该字段的default 大于max_length,这会导致错误。

现在我不确定您为什么要在数量字段中保存两个字符串的元组,所以我忽略了这一点,但如果您可以在此处评论您的预期逻辑,我也许可以编辑答案。

无论如何,Prescription 模型。

此模型将充当 Drug 和 DocAide 之间的中介,它是保存数量信息的模型。我已经使用外键将它与Drug 和DocAide 链接起来,并将related_name 设置为合适的名称。您会发现这些“related_names”显示在参考模型中。因此,例如,如果您可以这样做

doc_aide = DocAide.objects.get(pk=1)
for presc in doc_aide.prescriptions:
    print(presc.drug.name)
    print(presc.quantity)

这意味着一个DocAide 对象将与一个或多个Prescription 对象链接,每个对象都包含quantity 信息并与一个Drug 对象链接:

DocAide (id, etc) >> Prescription (doc_aide_id, drug_id, qty_info) >> Drug (id, etc) 

附带说明,在您确定一切正常并且一切顺利之后,您可能需要研究 Django 中的查询优化,因为按照现在的编写方式,它还没有得到优化。但是在你完成并且你的代码可以正常工作之前不要担心优化。

【讨论】:

  • 这听起来很合理,老实说,在我阅读您的答案之前,我已经开始这样做了。我很高兴知道我走在正确的道路上。但我不会接管整个事情,然后我会让你知道我得到了什么。谢谢
  • 你好bluegrounds,很抱歉回来晚了。但是我已经尽我所能完整地尝试了你的代码。我遇到了一些问题。我希望你能帮我解决这些问题。问题是模型之间的链接似乎不起作用。我正在尝试访问视图中的处方,但它没有该属性,它说?
  • 不,表单没有该属性,但我如何访问视图中的这些条目并保存在 doc_aide 模型中。或者是表格数据。然后出现另一个问题,如果我有另一个表格,那么我必须在一个模板中使用这两个表格。那怎么办?
  • @AI 如果没有看到代码,我真的帮不了你。如果问题不是太离题,我建议编辑上面的问题,或者如果是,请提出一个新问题并告诉我检查一下。但是在 cmets 中,提供任何帮助真的很困难。
  • 你是对的对不起,这是新的Q:stackoverflow.com/questions/60467812/…谢谢你的帮助
【解决方案2】:

您可能希望将 Drug 模型的某些字段移动到 an intermediary one that defines a foreign key to both your Drug and DocAide models。

这个模型应该被用作the through option of your DocAide.drugs field。

如果您使用管理员,您将能够 rely on inlines 显示一个输入表单,允许选择所需的 Drug 并注释额外的字段,否则您可能必须构建自己的机制 relies on ModelFormSet .

【讨论】:

  • 好的,谢谢你的建议,我会试试,让你知道我是怎么做到的
猜你喜欢
  • 2010-12-13
  • 1970-01-01
  • 2023-04-06
  • 2018-04-21
  • 2013-12-11
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
相关资源
最近更新 更多