Задайте параметры шаблона и wrapper_class и отобразите одно поле формы, а не форму - PullRequest
0 голосов
/ 26 ноября 2018

Связано Q & A .Вы можете рассмотреть этот вопрос после него

Мой класс формы:

class RoomForm(ModelForm):
    room_in_type = forms.ChoiceField(choices = [(elem[0], elem[1])  for elem in filter(lambda x: x[2] == False, memcache.Client().get("room_in_type_choices"))], widget=forms.RadioSelect())    
    class Meta:
        model = Room
    def __init__(self, *args, **kwargs):
        super(RoomForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_method = 'post'
        self.helper.form_action = form_action
        self.helper.label_class = 'col-md-8'
        self.helper.form_class = 'form-horizontal'
        self.helper.layout = Layout(
           InlineRadios('room_in_type', required=True, css_classes="col-md-8", template='some_template.html'),
           Field('country', required=True, css_class="country-container", wrapper_class ='toto-class'),
           Field('fb_user', type='hidden')
           )

соответствующая часть моего шаблона:

{{ form.country | as_crispy_field}}
{{ form.room_in_type | as_crispy_field}}

в этом случае:
ни template='some_template.html', ни wrapper_class ='toto-class' не считается

, но если я отрисовываю {% crispy form%}, оба поля имеют место.

Мой вопрос:

Не так ли?возможно ли задать эти параметры при рендеринге как одно поле?

1 Ответ

0 голосов
/ 29 ноября 2018

Мой вопрос:

Разве невозможно задать эти параметры при рендеринге в виде одного поля?

Краткий ответ: не совсем.Причина, по которой вы видите это различие, заключается в том, что helper.layout объекта формы используется только при рендеринге всей формы, используя {% crispy form %} - helper.layout не играет роли, когда вы используете crispy для визуализации полей по отдельности.Из раздела Основы их документов по макетам :

Это позволяет вам устанавливать порядок полей, заключать их в div или другие структуры, добавлять html, устанавливать идентификаторы,классы или атрибуты к тому, что вы хотите, и т. д. И все это без написания пользовательского шаблона формы, с использованием программных макетов.

Таким образом, вы можете либо изменить HTML-код в шаблоне, который содержит поле /рассматриваемой формы (было бы неплохо разместить этот код в отдельном шаблоне для включения в несколько мест), либо использовать собственный шаблон для виджетов.Последний маршрут может выглядеть примерно так:

class RoomForm(ModelForm):
    ...
    def __init__(...):
        self.fields['room_form'].widget.template_name = 'path/to/your/template.html'
        self.fields['room_form'].widget.attrs['class'] = 'my-custom-class'

И ваш шаблон может выглядеть так:

<!-- path/to/your/template.html -->
<div class="my-wrapper-class">{% include 'django/forms/widgets/radio.html' %}</div>

А затем, когда вы визуализируете свои поля по отдельности, используя as_crispy_field,вышеуказанный код будет использоваться.Вы можете обратиться к встроенным шаблонам, если вы идете по этому маршруту:

...