Question

J'ai un peu de code de formulaire Django qui ressemble à ceci:

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

Et cela fait disparaître le champ de formulaire, mais laisse le libellé "Ordre". dans la page d'administration de Django. Si j'utilise:

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

Il me reste toujours le "": " entre l'endroit où se trouvaient le champ et l'étiquette.

Comment puis-je cacher le tout?!

Était-ce utile?

La solution

Si vous utilisez JQuery, cela devrait faire l'affaire:

Votre formulaire

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

Code Javascript à ajouter à votre modèle

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

Cela fonctionne si vous présentez votre formulaire sous forme de tableau. Si vous souhaitez le faire fonctionner avec n'importe quel type de rendu de formulaire, procédez comme suit:

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

Et ajoutez form_field_container à votre contexte de modèle. Un exemple:

Si vous rendez le formulaire comme suit:

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

Votre contexte doit inclure:

'form_field_container': 'span'

Vous avez l’idée ...

Autres conseils

Oraculum a bien compris. Vous ne devriez pas nettoyer cela du côté client. Si c'est encombré, alors vous ne devriez pas l'envoyer au client du tout. En vous appuyant sur la réponse d’Oraculum, vous devez utiliser un modèle de formulaire personnalisé, car vous souhaitez probablement toujours conserver les valeurs cachées dans le formulaire.

{% 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 %}

L'utilisation d'un modèle de formulaire personnalisé pour contrôler les champs cachés est plus propre car elle n'envoie pas d'informations superflues au client.

Je ne peux pas croire que plusieurs personnes ont suggéré d'utiliser jQuery pour cela ...

S'agit-il de: quand le seul outil que vous connaissez est un marteau, tout ressemble à un clou?

Allez, si vous voulez le faire depuis le côté client (au lieu de fixer la source du problème dans le code back-end), le bon endroit pour le faire serait sûrement en CSS?

Si vous vous trouvez dans le site d'administration, c'est un peu plus dur, mais s'il s'agit d'une page normale, il est facile d'omettre l'intégralité de l'étiquette du modèle de formulaire, par exemple

Si vous êtes sur le site admin, vous pouvez toujours remplacer les méthodes as_p, as_ul, as_p de BaseForm (voir django / forms / forms.py) dans votre classe GalleryAdminForm pour omettre le libellé de tout champ contenant ce libellé. vide (ou == ':' comme la valeur peut être à ce stade du rendu)

(... regardant les lignes 160 à 170 des formulaires .py , il semble que Django 1.2 devrait correctement omettre le ':' si l’étiquette est vide alors je suppose que vous utilisez une version plus ancienne?)

Essayez

{% pour le champ dans form.visible_fields%}

Je pense qu’il est plus simple de réaliser le ": " omission d'étiquette pour le widget HiddenInput en modifiant la classe AdminField (objet) dans contrib / admin / helpers.py à partir de:

    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

Vérifiez la réponse à l'adresse créer un champ masqué dans l'administrateur. site , vous pouvez le faire sans JavaScript en remplaçant admin / includes / fieldset.html À partir de là, vous pouvez injecter une classe CSS et faire le reste.

En théorie, vous devriez pouvoir passer label_suffix dans le constructeur de formulaire. Cependant, l’administrateur de Django ignore cela.

Vous avez été piqué par deux bogues dans Django: # 18134 'BoundField.label_tag devrait inclure form.label_suffix ' (corrigé dans le coffre, devrait être en 1.6) et dans une moindre mesure # 11277 Champs masqués dans Les éléments en ligne sont affichés sous forme de lignes vides .

Actuellement, la meilleure solution consiste à remplacer le modèle de champs admin. Utilisez un HiddenInput pour votre widget, puis remplacez le modèle de jeu de champs admin ( documentés ici ). Créez simplement un templates / admin / includes / fieldset.html avec le contenu suivant:

<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>

D'après la solution de Wilfried Hughes, j'ai modifié le fieldset.html avec de petites améliorations.

L'extrait de code ci-dessous masque non seulement l'élément d'entrée, mais si l'ensemble de champs contient un seul élément dont le type d'entrée est défini sur masqué, il masque également les éléments div qui l'entourent ne gaspillant aucun espace dans le formulaire.

<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 %}

Ce qui suit supprime le ':' de tous vos champs de formulaire. Je ne l'ai essayé qu'avec la classe forms.Form , mais je crois que cela devrait également fonctionner pour forms.ModelForm .

Dans les formulaires Django, le ':' après les étiquettes est le label_suffix . Vous pouvez modifier ou supprimer le label_suffix en créant une sous-classe de ModelForm , appelée ici UnstyledForm , et en redéfinissant la fonction d'initialisation avec label_suffix défini sur une chaîne vide. Ensuite, utilisez votre nouvelle classe 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())

J'espère que cela aide!

Une autre façon de le faire, mais je pense qu’il est encore préférable d’itérer form.visible_fields & amp; 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top