gpt4 book ai didi

python - 在 Django 模型表单中使用模型属性

转载 作者:太空狗 更新时间:2023-10-30 00:07:16 25 4
gpt4 key购买 nike

我正在尝试使用模型属性,例如模型表单中的字段,但到目前为止还没有成功。结果是表单只呈现模型字段,而不是我定义的属性。知道如何让表单识别添加到模型中的属性吗?我希望看到添加的纬度属性只是表单中的另一个字段。

模型.py:

class Plot(models.Model):
plot_id = models.AutoField(primary_key=True)
plot_number = models.IntegerField(validators=[MinValueValidator(1)], null=False, unique=True)
geometry = models.PointField(srid=2163, null=True, blank=True)
objects = models.GeoManager()

@property
def latitude(self):
self.geometry.transform(4326)
return self.geometry.y

@latitude.setter
def latitude(self, latitude):
self.geometry.y = latitude

Forms.py:

class InventoryPlotForm(ModelForm):
class Meta:
model = ForestInventoryPlot
exclude = {"geometry"}

最佳答案

几年后。一个完整的答案,在 Django 中工作到 2.2。正如其他人指出的那样,模型表单中只包含真实的数据库字段。因此,您需要:

  • 定义一个自定义模型表单,添加您的@property 字段
  • 排除几何字段
  • 在表单的__init__中,获取值,并设置为initial
  • 自定义您的保存方法(在表单或管理员上)

注意:这也适用于更复杂的情况,您想要抽象出一些更复杂的数据库结构...


class InventoryPlotForm(ModelForm):

class Meta:
model = ForestInventoryPlot
exclude = ("geometry", )

latitude = forms.WhateverField()

def __init__(self, *args, **kwargs):
instance = kwargs.get('instance', None)
if instance:
kwargs['initial'] = {'latitude': instance.latitude, }
super().__init__(*args, **kwargs)

def save(self, *args, **kwargs):
self.instance.latitude = self.cleaned_data['latitude']
return super().save(*args, **kwargs)

关于python - 在 Django 模型表单中使用模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22062104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com