Пользовательская ModelForm с FormHelper повторно добавляет кнопки Div после каждого обновления при передаче макета - PullRequest
0 голосов
/ 06 ноября 2019

Чтобы сохранить мои ModelForm s СУХИЕ, я создал пользовательский ModelForm с FormHelper, чтобы я мог добавить Div с кнопками Submit и Cancel к layout. Он также предлагает возможность добавить пользовательский макет.

Это прекрасно работает, когда я не указываю пользовательский макет, но когда я это делаю, каждый раз, когда я обновляю страницу, он добавляет кнопки Div (это не происходит, когда нет пользовательского макета)

Это пользовательский ModelForm:

class ModelFormWithHelper(ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        kwargs = self.get_helper_kwargs()
        helper_class = FormHelper(self)
        if 'custom_layout' in kwargs:
            self.helper.layout = kwargs['custom_layout']
        self.helper.form_class = 'form-horizontal'
        self.helper.label_class = 'col-md-12'
        self.helper.field_class = 'col-md-12'
        self.helper.layout.append(
            Div(
                HTML('<br>'),
                FormActions(
                    Submit('submit', 'Save'),
                    HTML('<a class="btn btn-secondary" href="{{ request.META.HTTP_REFERRER }}">Cancel</a>')
                ),
                css_class='row justify-content-center',
            ),
        )

    def get_helper_kwargs(self):
        kwargs = {}
        for attr, value in self.Meta.__dict__.items():
            if attr.startswith('helper_'):
                new_attr = attr.split('_', 1)[1]
                kwargs[new_attr] = value
        return kwargs

И это ModelForm:

class CargoForm(ModelFormWithHelper):
    class Meta:
        model = Cargo
        exclude = []
        helper_custom_layout = Layout(
            Div(
                'name',
                'order',
                css_class='col-6 offset-3',
            ),
        )

Это форма без custom_layout после того, как я обновил страницу 3 раза: form with no custom_layout

А это форма с custom_layout после того, как я обновил страницу 3 раза: enter image description here

Я знаю, что могу использовать метод self.helper.add_input, чтобы избежать этой проблемы, но тогда я не смогу центрировать кнопки de.

Я быСпасибо, если кто-нибудь может помочь мне решить эту проблему. Заранее спасибо.

1 Ответ

0 голосов
/ 08 ноября 2019

После почти психического расстройства я наконец-то понял это.

Для тех, кто пытается достичь той же цели, вот решение (я избавился от get_helper_kwargs метода, так как я использую только helper_custom_layout)

# Put it in a variable to avoid repeating it twice
buttons_layout = Layout(
    Div(
        HTML('<br>'),
        FormActions(
            Submit('submit', 'Save'),
            HTML('<a class="btn btn-secondary" href="{{ request.META.HTTP_REFERER }}">Cancel</a>')
        ),
        css_class='row justify-content-center',
    ),
)


class ModelFormWithHelper(ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        custom_layout = getattr(self.Meta, 'helper_custom_layout', None)
        self.helper = FormHelper(self)
        self.helper.form_class = 'form-horizontal'
        self.helper.label_class = 'col-md-12'
        self.helper.field_class = 'col-md-12'
        if custom_layout:
            self.helper.layout = Layout(custom_layout, buttons_layout)
        else:
            self.helper.layout.append(buttons_layout)

И все. Теперь вы можете сделать свой кастом Layout чуть более СУХИМ. Надеюсь, вы найдете это полезным.

...