在呈现给用户之前修改UpdateView表单数据

时间:2015-02-07 19:05:45

标签: django django-forms django-views

我正在使用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']

要创建新的I实现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)

一切正常。现在,我正在尝试执行与Update_View中的form_valid()相反的操作,以获取有人获取表单时的情况。因此,我需要从单个模型值开始,并创建经度,纬度和范围值。我尝试在get_context_data()中执行此操作,但我只能弄清楚如何添加字段而不是如何修改现有字段。

这似乎是一个非常常见的问题,但我似乎无法找到如何实现这一点的示例。也许我在寻找错误的地方。

1 个答案:

答案 0 :(得分:1)

您可能希望覆盖get_initial方法以提供默认值。该方法应返回字典映射字段名称为其默认值。