Представление Django Formview.get () выполняет код формы __init__ дважды, это правильный подход? - PullRequest
0 голосов
/ 10 ноября 2019

Когда django обслуживает представление, используется класс формы UserRegisterForm (forms.Form), и функция init этой формы выполняется дважды.

Я не могу определить, почему формавыполняется дважды.

RegisterView переопределяет функцию get (), предоставляемую FormView. Если я закомментирую функцию get, форма будет возвращена правильно, а функция init для UserRegisterForm будет выполнена только один раз.

class RegisterView(generic.FormView):
    template_name = 'dl_user/register.html'
    form_class = UserRegisterForm
    success_url = reverse_lazy('dl_user:register_success')
    def get(self, request):
        request.session._get_or_create_session_key()
        prices_json = json.dumps(settings.prices, cls=DjangoJSONEncoder)
        context = {
            'form': self.form_class,
            'prices': prices_json,
        }
        request.session['prices'] = prices_json
        return render(request, self.template_name, context)

RegesterView отображает UserRegisterForm

class UserRegisterForm(forms.Form):

    request = None
    payment_method = forms.TypedChoiceField(
                                        choices=payment.getPaymentOptions(),
                                        coerce=lambda x: str(x),
                                        widget=forms.Select,
                                        initial='1',
                                        required=True)

    payment_amount = forms.DecimalField(required=True, max_digits=100, decimal_places=8)
    # mandatory schema fields during registration
    username = forms.CharField(required=True,
                               min_length=3,
                               max_length=30,
                               help_text='Choose a memorable name e.g jdoe',
                               validators=[UnicodeUsernameValidator()])

    password = forms.CharField(widget=forms.PasswordInput, min_length=8)
    password1 = forms.CharField(widget=forms.PasswordInput, min_length=8, label='Confirm Password')


    def __init__(self, *args, **kwargs):
        self.request = kwargs.get('request')
        if 'request' in kwargs:
            del kwargs['request']
        super(UserRegisterForm, self).__init__(*args, **kwargs)
        self.ldap_ops = LDAPOperations()

        self.helper = FormHelper()
        self.helper.form_id = 'id-user-data-form'
        self.helper.form_method = 'post'
        # self.helper.form_action = 'register'
        self.helper.add_input(Submit('submit', 'Submit', css_class='btn-success'))
        self.helper.form_class = 'form-horizontal'
        self.helper.label_class = 'col-md-2'
        self.helper.field_class = 'col-md-8'
        self.helper.error_text_inline = False
        self.helper.layout = Layout(
                                    Fieldset('Login Details',
                                             'username', 'password', 'password1'),
                                    )


        self.helper.layout.append(
                Fieldset('Payment',
                    Field('membership_in_days', onclick="updatePrice(value);"),
                    Field('payment_method', onclick="updatePaymentMethod(value)"),
                    Field('payment_amount', readonly=True),
                )
            )

Я ожидаю, что форма будет загружена правильно, без UserRegisterForm. init выполняется дважды.

1 Ответ

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

Переопределение get_context_data вместо get решило мою проблему. Вот описание и пример, на котором я основал свой код: Когда использовать get, get_queryset, get_context_data в Django?

...