Подтвердить что ты не робот

Как скрыть метку поля для виджета HiddenInput в Django Admin?

У меня есть код формы Django, который выглядит так:

class GalleryAdminForm(forms.ModelForm):
    auto_id=False
    order = forms.CharField(widget=forms.HiddenInput())

И это заставляет поле формы уйти, но оно оставляет метку "Заказ" на странице администрирования Django. Если я использую:

order = forms.CharField(widget=forms.HiddenInput(), label='')

Мне все еще остается ":" между тем, где раньше было поле и метка.

Как скрыть все это?!

4b9b3361

Ответ 1

Если вы используете JQuery, это должно сделать трюк:

Ваша форма

TO_HIDE_ATTRS = {'class': 'hidden'}
class GalleryAdminForm(forms.ModelForm):
    auto_id=False
    order = forms.CharField(widget=forms.TextInput(attrs=TO_HIDE_ATTRS))

Код Javascript для добавления в шаблон

$(document).ready(function(){
    $('tr:has(.hidden)').hide();
});

Это работает, если вы создаете форму в виде таблицы. Если вы хотите, чтобы он работал с любым видом рендеринга формы, вы можете сделать следующее:

$(document).ready(function(){
    $('{{ form_field_container }}:has(.hidden)').hide();
});

И добавьте form_field_container в контекст вашего шаблона. Пример:

Если вы делаете свою форму следующим образом:

    <form>
        <span>{{ field.label_tag }} {{ field }}</span>
    </form>

Ваш контекст должен включать:

'form_field_container': 'span'

Вы получаете идею...

Ответ 2

У Оракулума все правильно. Вы не должны чистить это на стороне клиента. Если это беспорядок, вы не должны отправлять его клиенту. Основываясь на ответе Oraculum, вы должны использовать шаблон пользовательской формы, потому что вам, вероятно, все еще нужны скрытые значения в форме.

{% for field in form.visible_fields %}
    <div>
        {{ field.errors }}
        <span class="filter-label">{{ field.label_tag }}</span><br>
        {{ field }}
    </div>
 {% endfor %}

 {% for field in form.hidden_fields %}
     <div style="display:none;">{{ field }}</div>
 {% endfor %}

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

Ответ 3

Не могу поверить, что некоторые люди предложили использовать jQuery для этого...

Это случай: когда единственным инструментом, который вы знаете, является молоток, все выглядит как гвоздь?

Давай, если ты собираешься сделать это с клиентской стороны (вместо того, чтобы исправить исходный код проблемы во внутреннем коде), то, конечно, подходящее место для этого было бы в CSS?

Если вы находитесь на админ-сайте, это немного сложнее, но если это обычная страница, тогда легко просто опустить целую метку из шаблона формы, например

Если вы находитесь на админ-сайте, вы все равно можете переопределить as_table, as_ul, as_p методы BaseForm (см. django/forms/forms.py) в вашем классе GalleryAdminForm, чтобы опустить метку любого поля, где указан ярлык blank (или == ':', поскольку значение может быть на этом этапе рендеринга)

(... глядя на строки 160-170 forms.py, похоже, что Django 1.2 должным образом опускает символ:: if ярлык пуст, поэтому, я думаю, вы находитесь в более старой версии?)

Ответ 4

Try

{% для поля в форме .visible_fields%}

Ответ 5

Мне кажется, что проще пропустить ярлык ":" для виджета HiddenInput, изменив class AdminField(object) в contrib/admin/helpers.py на:

    if self.is_checkbox:
        classes.append(u'vCheckboxLabel')
        contents = force_unicode(escape(self.field.label))
    else:
        contents = force_unicode(escape(self.field.label)) + u':'

to:

    if self.is_checkbox:
        classes.append(u'vCheckboxLabel')
        contents = force_unicode(escape(self.field.label))
    else:            
        contents = force_unicode(escape(self.field.label))
        #MODIFIED 26/10/2009
        if self.field.label <> '':
           contents += u':'
        # END MODIFY

Ответ 7

В теории вы должны пройти label_suffix в конструктор формы. Однако администратор Django игнорирует это.

Вы были укушены двумя ошибками в Django: # 18134 "BoundField.label_tag должен включать form.label_suffix" (исправлено в trunk, должен быть в 1.6) и в меньшей степени # 11277 Скрытые поля в строке отображаются как пустые строки.

В настоящее время лучшим решением является переопределить шаблон набора полей admin. Используйте HiddenInput для вашего виджета, затем переопределите шаблон набора полей admin (описанный здесь). Просто создайте templates/admin/includes/fieldset.html со следующим содержимым:

<fieldset class="module aligned {{ fieldset.classes }}">
    {% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %}
    {% if fieldset.description %}
        <div class="description">{{ fieldset.description|safe }}</div>
    {% endif %}
    {% for line in fieldset %}
        <div class="form-row{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}">
            {% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %}
            {% for field in line %}
                <div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}"{% endif %}>
                    {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
                    {% if field.is_checkbox %}
                        {{ field.field }}{{ field.label_tag }}
                    {% else %}
                        {# only show the label for visible fields #}
                        {% if not field.field.is_hidden %}
                        {{ field.label_tag }}
                        {% endif %}

                        {% if field.is_readonly %}
                            <p>{{ field.contents }}</p>
                        {% else %}
                            {{ field.field }}
                        {% endif %}
                    {% endif %}
                    {% if field.field.help_text %}
                        <p class="help">{{ field.field.help_text|safe }}</p>
                    {% endif %}
                </div>
            {% endfor %}
        </div>
    {% endfor %}
</fieldset>

Ответ 8

Основываясь на решении Wilfried Hughes, я немного изменил файл fieldset.html.

Ниже приведенный ниже фрагмент кода не только скрывает входной элемент, если набор полей содержит только один единственный элемент, для которого тип ввода задан как скрытый, он также скрывает окружающие div-элементы, не теряющие пробела в форме.

<fieldset class="module aligned {{ fieldset.classes }}">
{% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %}
{% if fieldset.description %}
    <div class="description">{{ fieldset.description|safe }}</div>
{% endif %}
{% for line in fieldset %}
    <div class="form-row{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}"{% if line.fields|length_is:'1' %}{% for field in line %}{% if field.field.is_hidden %} style="display: none"{% endif %}{% endfor %}{% endif %}>
        {% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %}
        {% for field in line %}
            <div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}"{% endif %}{% if field.field.is_hidden %} style="display: none"{% endif %}>
                {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
                {% if field.is_checkbox %}
                    {{ field.field }}{{ field.label_tag }}
                {% else %}
                    {# only show the label for visible fields #}
                    {% if not field.field.is_hidden %}
                    {{ field.label_tag }}
                    {% endif %}

                    {% if field.is_readonly %}
                        <p>{{ field.contents }}</p>
                    {% else %}
                        {{ field.field }}
                    {% endif %}
                {% endif %}
                {% if field.field.help_text %}
                    <p class="help">{{ field.field.help_text|safe }}</p>
                {% endif %}
            </div>
        {% endfor %}
    </div>
{% endfor %}

Ответ 9

Следующее удаляет ':' из всех полей формы. Я только пробовал его с классом forms.Form, но я считаю, что он должен работать и для forms.ModelForm.

В формах Django символ: после ярлыков label_suffix. Вы можете изменить или удалить label_suffix, создав подкласс ModelForm, называемый UnstyledForm, и переопределив функцию инициализации с помощью label_suffix, установленную в пустую строку. Затем используйте новый класс UnstyledForm.

class UnstyledForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        kwargs.setdefault('label_suffix', '')
        super(UnstyledForm, self).__init__(*args, **kwargs)

class GalleryAdminForm(UnstyledForm):
    auto_id=False
    order = forms.CharField(widget=forms.HiddenInput())

Я надеюсь, что это поможет!

Ответ 10

Другой способ сделать это, но я думаю, что еще лучше перебирать form.visible_fields и form.hidden_fields

<form action="{% url 'some_url' param %}" method="POST">
    {% csrf_token %}
    <div class="row">
        {% for field in form %}

            {% if not field.is_hidden %}
                <div class="col-md-6">
                    {{ field.label_tag }}
                    {{ field.error }}
                    {{ field }}
                </div>
            {% else %}
                {{ field }}
            {% endif %}
        {% endfor %}
     </div>
</form>