带有编辑字段和 select 字段的 Django 外键如何放入表单
Django Foreignkey with edit fields and select field how to put in form
如果之前有人提出过这个问题,我深表歉意。但是我已经为此苦苦挣扎了数周,却找不到任何有用的东西。
我有以下问题(它被简化了很多但本质上是我的问题)
我有一个有很多字段的模型。它被称为
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 有药物名称和数量我希望有可能 select 多种药物,但编辑字段显示需要的剂量什么时候服用,应该像处方一样。模型看起来像这样:
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 它不起作用。稍后我也希望对它们进行预select编辑。
但现在我想要一个按钮,它会生成一行包含药物下拉列表和模型编辑字段的行。
提前致谢。
您可能想将 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
to display an input form that allows selecting the desired Drug
and annotating extra fields otherwise you'll likely have to build your own mechanism that relies on ModelFormSet
。
正如其他人所说,药物对象不应该有与之关联的数量,但处方 "entry" 应该。
我认为这是您需要的模型结构:
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
保存容器名称,如 "Bottle"、"Injection" 等。
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 中的查询优化,因为正如现在所写的那样,它还没有经过优化。但是在您完成并且您的代码可以正常工作之前,不要担心优化。
如果之前有人提出过这个问题,我深表歉意。但是我已经为此苦苦挣扎了数周,却找不到任何有用的东西。
我有以下问题(它被简化了很多但本质上是我的问题)
我有一个有很多字段的模型。它被称为
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 有药物名称和数量我希望有可能 select 多种药物,但编辑字段显示需要的剂量什么时候服用,应该像处方一样。模型看起来像这样:
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 它不起作用。稍后我也希望对它们进行预select编辑。
但现在我想要一个按钮,它会生成一行包含药物下拉列表和模型编辑字段的行。
提前致谢。
您可能想将 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
to display an input form that allows selecting the desired Drug
and annotating extra fields otherwise you'll likely have to build your own mechanism that relies on ModelFormSet
。
正如其他人所说,药物对象不应该有与之关联的数量,但处方 "entry" 应该。
我认为这是您需要的模型结构:
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
保存容器名称,如 "Bottle"、"Injection" 等。
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 中的查询优化,因为正如现在所写的那样,它还没有经过优化。但是在您完成并且您的代码可以正常工作之前,不要担心优化。