django 从UpdateView设置ModelForm上额外字段的初始值

myzjeezk  于 2022-12-01  发布在  Go
关注(0)|答案(1)|浏览(122)

我有一个带有两个额外字段的modelform表单。在我的模型中,它包括一个由东距和北距(Point的X和Y分量)组成的PointField。在我的modelform中,我不显示PointField,而是显示两个DecimalField分别表示东距和北距:

class QuoteForm(forms.ModelForm):
  easting = forms.DecimalField()
  northing = forms.DecimalField()
  class Meta:
    model = Quote
    fields = ('desc', 'client', 'contact', 'amount', 'easting', 'northing', 'note')      

  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['note'].required = True
    self.helper = FormHelper()
    self.helper.form_method = 'post'
    self.helper.add_input(Submit('submit', 'Save Quote')
    )

对于我的CreateView,我包括了一个form_valid,它接受东距和北距,并将它们转换为一个点,然后更新PointField记录。
对于我的UpdateView,我想从PointField返回并填充窗体上的Easting和Northing DecimalFields。
我在如何将此信息“传递”到我的表单上遇到了麻烦。
我在UpdateView中尝试了如下get_form,但失败了:

class QuoteUpdateView(PermissionRequiredMixin, UpdateView):
  permission_required = 'jobs.update_quote'
  redirect_field_name = 'dashboard'
  model = Quote
  form_class = QuoteForm    
  template_name = "jobs/quote_form.html"
  template_name_suffix = '_form'
  
  def get_form(self, form_class=None):
    form = super().get_form(form_class)
    quote = self.object
    pt = quote.ptgeom
    pt.transform(2953)
    form.fields['easting'] = pt[0]
    form.fields['northing'] = pt[1]
    return form

  def form_valid(self, form):     
    quote = form.save(commit=False)
    quote.ptgeom = geos.Point((form.cleaned_data['easting'], form.cleaned_data['northing']), srid=2953)
    quote.save()
    return super().form_valid(form)

  def get_success_url(self):
    return reverse('quote_detail', kwargs={'pk' : self.object.id})

在我目前的方法中,我对创建和更新视图使用相同的表单。感觉我可以创建一个不同的表单,并使用get_context_data之类的方法来查找正确的记录,然后更新字段,但这感觉不是正确的方法吗?
是否有方法从UpdateView设置这些值?

l5tcr1uw

l5tcr1uw1#

您可以通过get_initial(包含在updateview中)获取并更改get_form函数中字段的初始值。

def get_form(self, form_class=None):
    form = super().get_form(form_class)
    quote = self.object
    pt = quote.ptgeom
    pt.transform(2953)
    #set form initial values
    initial_values = self.get_initial() 
    initial_values['easting'] = pt[0]
    initial_values['northing'] = pt[1]
    form.initial = initial_values
    return form

注解后更新
您可以尝试在get_initial本身中执行相同的操作,以防上述操作干扰操作顺序。

def get_initial(self):
    initial_values = super().get_initial()
    quote = self.object
    pt = quote.ptgeom
    pt.transform(2953)
    initial_values['easting'] = pt[0]
    initial_values['northing'] = pt[1]
    return initial_values

相关问题