Как скрыть метку поля для виджета HiddenInput в Django Admin? - PullRequest
17 голосов
/ 11 сентября 2009

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

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

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

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

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

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

Ответы [ 10 ]

38 голосов
/ 25 сентября 2012

Оракулум понял это правильно. Вы не должны убирать это на стороне клиента. Если это беспорядок, то вы не должны отправлять его клиенту вообще. Основываясь на ответе 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 %}

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

36 голосов
/ 22 ноября 2010

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

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

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

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

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

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

17 голосов
/ 29 августа 2012

Попробуйте

{% для поля в form.visible_fields%}

3 голосов
/ 28 июня 2011

Проверьте ответ на Создайте скрытое поле на сайте администратора , это можно сделать без JavaScript, переопределив admin/includes/fieldset.html Оттуда вы можете внедрить класс CSS и делать все остальное.

3 голосов
/ 27 октября 2009

Я думаю, что проще добиться пропуска метки ":" для виджета 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':'

до:

    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
2 голосов
/ 31 мая 2014

Основываясь на решении Уилфрида Хьюза, я изменил 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 %}

2 голосов
/ 14 августа 2013

Теоретически, вы должны иметь возможность передать label_suffix в конструктор формы. Однако администратор Django игнорирует это.

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

В настоящее время лучшим решением является переопределение шаблона набора полей администратора. Используйте HiddenInput для вашего виджета, затем переопределите шаблон набора полей администратора ( задокументировано здесь ). Просто создайте 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>
0 голосов
/ 25 января 2017

Еще один способ сделать это, но я думаю, что все же лучше перебрать 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>
0 голосов
/ 11 января 2017

Следующее удаляет ':' из всех полей формы. Я пробовал это только с классом 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())

Надеюсь, это поможет!

0 голосов
/ 11 сентября 2009

Если вы используете 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'

Вы поняли ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...