gpt4 book ai didi

python - Django 在呈现 ModelForm 之前更改模型数据

转载 作者:行者123 更新时间:2023-12-02 04:02:58 26 4
gpt4 key购买 nike

我正在尝试生成一个对象,该对象允许以标准单位存储值,但根据项目设置以不同单位显示。下面是一个示例,我需要能够存储房间的温度。我希望数据库值以开尔文为单位以便于计算,但希望用户能够根据项目需要以 F 或 C 形式查看/输入。

模型可以从表单中获取值并在保存时将它们转换为开尔文。我知道这可以在表单中完成,但我在这里为其他数据输入方法提供了它。该模型的精简版如下:

class Room(models.Model):
name = models.CharField(max_length=255)
temperature = models.FloatField(default=293.15)

def save(self, *args, **kwargs):
self.temperature = convert.temperature(self.temperature,
from_unit=self.plant.temperature_scale)
super(Room, self).save(*args, **kwargs)

我创建了一个 ModelForm 以在 CreateView 和 UpdateView 中使用。我需要 ModelForm 来限制其他字段的查询集(效果很好)。在这里,我能够将温度场转换为 CreateView 中新对象所需的单位,但我似乎无法找到将现有记录拉下来的方法

class RoomForm(ModelForm):
def __init__(self, plant, *args, **kwargs):
super (RoomForm,self ).__init__(*args,**kwargs)

self.fields['temperature'].initial = convert.temperature(
value=self.fields['temperature'].initial,
from_unit='K',
to_unit=self.fields['unit'].queryset[0].plant.temperature_scale)

self.instance.temperature = convert.temperature(
value=self.instance.temperature,
from_unit='K',
to_unit=self.fields['unit'].queryset[0].plant.temperature_scale)

class Meta:
model = Room
fields = ['name', 'temperature']

以下是调用此表单的 View 。

class NewRoom(CreateView):
model = Room
form_class = RoomForm

def get_form_kwargs(self, **kwargs):
form_kwargs = super(NewRoom, self).get_form_kwargs(**kwargs)
form_kwargs["plant"] = Plant.objects.get(slug=self.kwargs['plant'])
return form_kwargs

class EditRoom(UpdateView):
model = Room
form_class = RoomForm
template_name_suffix = "_update_form"

def get_form_kwargs(self, **kwargs):
form_kwargs = super(EditRoom, self).get_form_kwargs(**kwargs)
form_kwargs["plant"] = Plant.objects.filter(slug=self.kwargs['plant'])
return form_kwargs

在模板(不是表单)中,我使用它来正确显示温度。

{{ room.temperature|convert_temperature:room.plant.temperature_scale }}

我假设我需要补充 ModelForm 从数据库记录中导入数据的部分,但我无法确定它在 django.forms 源代码中发生的位置。

我尝试在 shell 中手动调用它

>>> from rooms.models import *
>>> from rooms.forms import *
>>> room = Room.objects.first()
>>> form = RoomForm(room.plant, instance=room)
>>> form.instance.temperature
20.0
>>> form.as_p()

呈现的形式如下,温度值不正确

<p>
<label for="id_name">Name:
</label>
<input id="id_name" maxlength="255" name="name" type="text" value="Testing"
required />
</p>\n
<p>
<label for="id_temperature">Temperature:
</label>
<input id="id_temperature" name="temperature"
step="any" type="number" value="293.15" required />
</p>\n

我正在使用 Django 版本 1.10.3 如果这可能是一个错误。

最佳答案

虽然 lucasnadalutti 让我进入了正确的位置,但它并没有成功。覆盖传递给 ModelForm.__init__ 的实例并在更改后再次调用它。

class RoomForm(ModelForm):

def __init__(self, plant, *args, **kwargs):
super(RoomForm, self).__init__(*args,**kwargs)

self.instance.temperature = convert.temperature(
value=self.instance.temperature,
from_unit='K', to_unit=self.fields['unit'].queryset[0].plant.temperature_scale)

# Override instance passed to __init__ and call super again
kwargs['instance'] = self.instance
super(RoomForm, self).__init__(*args, **kwargs)

class Meta:
model = Room
fields = ['name', 'temperature']

关于python - Django 在呈现 ModelForm 之前更改模型数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41024601/

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