Установка начального значения дополнительного поля в ModelForm из UpdateView

У меня есть форма, которая является модельной формой с двумя дополнительными полями. В моей модели она включает поле PointField, которое состоит из easting и northing (компоненты X & Y точки). В моей форме модели я не отображаю поле PointField и вместо этого отображаю два поля DecimalFields для easting и northing:

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, который принимает easting и northing и превращает их в точку и обновляет запись PointField.

Для моего UpdateView я хочу вернуться назад от поля PointField и заполнить поля Easting и Northing DecimalFields на моей форме.

Я застрял на том, как "передать" эту информацию моей форме.

Я попробовал get_form в моем UpdateView следующим образом, но он терпит неудачу:

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?

Вы можете захватывать и изменять начальные значения полей в вашей get_form функции get_initial, включенной в updateview.

  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
Вернуться на верх