Разделение одного поля из модели на два поля ввода формы в представлении обновления django
У меня это customer model
только с одним полем адреса.
class PullingCustomer(models.Model):
code = models.CharField(verbose_name='Code', max_length=10, primary_key=True)
name = models.CharField(verbose_name='Customer', max_length=255, blank=False, null=False)
address = models.CharField(verbose_name='Address', max_length=255, blank=False, null=False)
city = models.CharField(verbose_name='City', max_length=25, blank=True, null=True)
def __str__(self):
cust = "{0.name}"
return cust.format(self)
но на моем form.py
я разделил его на два входа, адрес 1 и адрес 2.
class PullingCustomerForm(ModelForm):
address1 = forms.CharField(max_length=155)
address2 = forms.CharField(max_length=100)
def __init__(self, *args, **kwargs):
super(PullingCustomerForm, self).__init__(*args, **kwargs)
self.helper = FormHelper(self)
self.helper.layout = Layout(
....
Row(
Column('address1', css_class = 'col-md-12'),
css_class = 'row'
),
Row(
Column('address2', css_class = 'col-md-8'),
Column('city', css_class = 'col-md-4'),
css_class = 'row'
),
....
class Meta:
model = PullingCustomer
fields = '__all__'
Затем я снова объединяю их на view.py
, чтобы сохранить его.
class PullingCustomerCreateView(CreateView):
form_class = PullingCustomerForm
template_name = 'pulling_customer_input.html'
def form_valid(self, form):
address1 = form.cleaned_data['address1']
address2 = form.cleaned_data['address2']
temp_form = super(PullingCustomerCreateView, self).form_valid(form = form)
form.instance.address = str(address1) + ', ' + str(address2)
form.save()
return temp_form
Поскольку я хочу использовать тот же макет формы на моем update view
, мне нужно снова разделить адрес на два. Каков наилучший метод для этого?
class PullingCustomerUpdateView(UpdateView):
model = PullingCustomer
form_class = PullingCustomerForm
template_name = 'pulling_customer_update.html'
Я считаю, что то, о чем вы просите, может быть покрыто MultiWidget. Я никогда не писал его, поэтому я не буду пытаться расширить это.
Альтернативно, не используйте поле address
в ModelForm (UpdateView). Используйте fields=
для исключения address
и добавления address1
и address2
в форму. Вы объедините их в form_valid
так же, как и в CreateView
def form_valid(self, form):
address1 = form.cleaned_data['address1']
address2 = form.cleaned_data['address2']
obj = form.save( commit=False)
obj.address = str(address1) + ', ' + str(address2)
obj.save()
Вам также понадобится код для получения текущего адреса и использования его для предоставления начальных значений для address1
и address2
формы. Используя UpdateView, вы подклассифицируете get_initial
. Я думаю:
def get_initial( self)
initial = super().get_initial()
address = self.object.address
# split address1, address2 from address in whatever way is appropriate
# for example, if you store with a newline \n separating them
address1, address2 = address.split('\n', maxsplit=1)
initial['address1'] = address1
initial['address2'] = address2
return initial