Разделение одного поля из модели на два поля ввода формы в представлении обновления 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
Вернуться на верх