在呈现给用户之前修改 UpdateView 表单数据
Modify UpdateView Form Data Before Presenting To User
我正在使用 CreateView 和 UpdateView 来管理保存和更新。在保存数据之前,我需要将 3 个表单字段合并为一个字段以将其存储在我的模型中。基本上,我采用经度、纬度和范围并将其转换为存储在我的数据库中的单个值。在我的 ModelForm 中,我创建了我需要的额外字段并删除了一个我不需要的字段:
class FilterForm(ModelForm):
lat = forms.FloatField()
lgt = forms.FloatField()
range = forms.FloatField()
class Meta:
model = AdFilter
fields = ['title', 'tags', 'start_date', 'end_date', 'start_time', 'end_time', 'week_days', 'ad']
为了创建新的,我实现了 form_valid() 以组合经度、纬度和范围并将其正确存储在我的模型中:
class FilterCreate(CreateView):
form_class = FilterForm
template_name = 'filter_form.html'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(FilterCreate, self).dispatch(*args, **kwargs)
def form_valid(self, form):
new_filter = form.save(commit=False)
new_filter.creator = self.request.user
utm_coordinates = utm.from_latlon(float(form.data['lat']), float(form.data['lgt']))
center = geos.Point(utm_coordinates[0], utm_coordinates[1])
broadcast_area_geometry = center.buffer(float(form.data['range']))
# Set the right SRID
utm_epsg = int('326' + str(utm_coordinates[2]))
broadcast_area_geometry.srid = utm_epsg
new_filter.filter_geometry = broadcast_area_geometry
new_filter.save()
return super(FilterCreate, self).form_valid(new_filter)
一切正常。现在我正在尝试做与 form_valid() 在我的 UpdateView 中做的相反的事情,以应对有人获得表格的情况。所以我需要从我的单一模型值出发,创建一个经度、纬度和范围值。我尝试在 get_context_data() 中执行此操作,但我只能弄清楚如何添加字段而不是如何修改现有字段。
这似乎是一个非常普遍的问题,但我似乎找不到如何实现它的示例。可能我看错地方了。
您可能想要覆盖 get_initial
方法以提供默认值。该方法应该 return 一个字典映射字段名称到它们的默认值。
我正在使用 CreateView 和 UpdateView 来管理保存和更新。在保存数据之前,我需要将 3 个表单字段合并为一个字段以将其存储在我的模型中。基本上,我采用经度、纬度和范围并将其转换为存储在我的数据库中的单个值。在我的 ModelForm 中,我创建了我需要的额外字段并删除了一个我不需要的字段:
class FilterForm(ModelForm):
lat = forms.FloatField()
lgt = forms.FloatField()
range = forms.FloatField()
class Meta:
model = AdFilter
fields = ['title', 'tags', 'start_date', 'end_date', 'start_time', 'end_time', 'week_days', 'ad']
为了创建新的,我实现了 form_valid() 以组合经度、纬度和范围并将其正确存储在我的模型中:
class FilterCreate(CreateView):
form_class = FilterForm
template_name = 'filter_form.html'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(FilterCreate, self).dispatch(*args, **kwargs)
def form_valid(self, form):
new_filter = form.save(commit=False)
new_filter.creator = self.request.user
utm_coordinates = utm.from_latlon(float(form.data['lat']), float(form.data['lgt']))
center = geos.Point(utm_coordinates[0], utm_coordinates[1])
broadcast_area_geometry = center.buffer(float(form.data['range']))
# Set the right SRID
utm_epsg = int('326' + str(utm_coordinates[2]))
broadcast_area_geometry.srid = utm_epsg
new_filter.filter_geometry = broadcast_area_geometry
new_filter.save()
return super(FilterCreate, self).form_valid(new_filter)
一切正常。现在我正在尝试做与 form_valid() 在我的 UpdateView 中做的相反的事情,以应对有人获得表格的情况。所以我需要从我的单一模型值出发,创建一个经度、纬度和范围值。我尝试在 get_context_data() 中执行此操作,但我只能弄清楚如何添加字段而不是如何修改现有字段。
这似乎是一个非常普遍的问题,但我似乎找不到如何实现它的示例。可能我看错地方了。
您可能想要覆盖 get_initial
方法以提供默认值。该方法应该 return 一个字典映射字段名称到它们的默认值。