2009-09-11 13 views
16

Mam kawałek kodu formularza Django, który wygląda tak:Jak ukryć etykietę pola dla widżetu HiddenInput w Django Admin?

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

A to sprawia, że ​​pole formularza odejść, ale pozostawia Etykieta „zamówienie” na stronie admina Django. Jeśli użyję:

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

Nadal pozostaję z ":" pomiędzy miejscem, w którym znajdowało się pole i etykieta.

Jak mogę ukryć całość ?!

+0

Zobacz także pytanie [Utwórz ukryte pole w django-admin] (http://stackoverflow.com/q/4999005/509706) i [ten bilet django] (https: //code.djangoproject .com/ticket/11277) –

Odpowiedz

-18

Jeśli używasz JQuery to powinno załatwić sprawę:

formularza

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

JavaScript, aby dodać do szablonu

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

To działa, jeśli renderujesz swój formularz jako stół. Jeśli chcesz, aby pracować z dowolnym rodzajem postaci renderowania można to zrobić w następujący sposób:

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

I dodać form_field_container do kontekstu szablonu. Przykład:

Jeśli renderowanie formularza takiego:

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

context musi zawierać:

'form_field_container': 'span' 

masz pomysł ...

+0

Bardziej ogólne rozwiązanie jQuery byłoby zrobienie '$ ('. hidden'). parent(). hide()' ponieważ spowoduje to ukrycie całego elementu div zawierającego widget, etykietę i dowolny tekst pomocy. Jest to działające rozwiązanie na pewno. Wiedziałem o dodawaniu niestandardowych attrów do widgetu, ale starałem się zrobić wszystko bez uciekania się do JS. Jestem zaskoczony, że Django nie ma wbudowanego sposobu, aby to zrobić. –

+0

Tak, '$ ('. Hidden'). Parent(). Hide() również działa, ale polega na tym, że rodzic twojego pola również zawiera etykietę. Gdybyś miał coś w rodzaju ' LABEL FIELD' to nie będzie działać, bo rodzic nie byłby tag TD jeden TR. Jestem również zaskoczony, że nie ma "sposobu django", aby to zrobić. –

+2

Szalone .. rozwiązanie - to jak strzelanie do much! –

3

myślę, że to prostsze Osiągnięcie pominięcia etykiety ":" dla widżetu HiddenInput poprzez zmodyfikowanie class AdminField(object) w contrib/admin/helpers.py z:

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

do:

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

To dobry sposób na zrobienie tego, choć nie jestem fanem modyfikowania czegokolwiek w rdzeniu django. Może prawdopodobnie podklasy obiektu i osiągnąć ten sam efekt w ten sposób. –

36

Nie mogę uwierzyć, kilka osób sugerowało jQuery dla tego ...

Czy to przypadek: gdy tylko narzędzie wiesz to wszystko młotek wygląda jak gwóźdź?

Daj spokój, jeśli masz zamiar zrobić to od strony klienta (zamiast naprawić źródło problemu w kodzie back-end), z pewnością właściwym miejscem będzie CSS?

Jeśli jesteś w miejscu admina to jest to nieco trudniejsze, ale jeśli jest to regularne strony wtedy łatwo jest po prostu pominąć całą etykietę z szablonu formularza, for example

Jeśli jesteś w miejscu admina wtedy możesz nadal przesłonić metody as_table, as_ul, as_p BaseForm (zobacz django/forms/forms.py) w twojej klasie GalleryAdminForm, aby pominąć etykietę dowolnego pola, w którym etykieta jest pusta (lub == ':' jako wartość może być na tym etapie renderowania)

(... patrząc na linie 160-170 z forms.py wydaje się Django 1.2, powinny właściwie pominąć „:” jeśli znacznik jest pusty, więc myślę, że jesteś na starszej wersji)

+0

Domyślam się, że musisz być w administratorze, kod wskazany przez @Tonino powyżej sztywnych kodów dwukropka do etykiety, gdy jest to formularz administracyjny i omija regularną mechanikę formularza. Chyba po prostu użyłbym CSS w tym przypadku. – Anentropic

+1

Patrząc na Django 1.4.5, ten błąd nadal występuje w formularzach administracyjnych. [Szablon wywołuje .label_tag] (https://github.com/django/django/blob/67a937c2c24b7eee8be13a1d3faff595d8f45839/django/contrib/admin/templates/admin/includes/fieldset.html#L15), który [dodaje bezwarunkowo dwukropek] (https://github.com/django/django/blob/67a937c2c24b7eee8be13a1d3faff595d8f45839/django/contrib/admin/helpers.py#L126). Myślę, że właściwym rozwiązaniem po stronie serwera jest zmiana szablonu administratora. –

+0

hi @WilfredHughes :) wygląda tak, jak zostało to naprawione w pniu Django (możesz nadać 'label_suffix' konstruktorowi formularzy!) ... problem nadal istnieje w wersji 1.5.1 i zmienia szablon administratora, aby pominąć' { {field.label_tag}} 'gdzie pożądane wydaje się być najlepszym sposobem – Anentropic

16

Spróbuj

{% na polu w form.visible_fields%}

+1

Awansuj. Nie mogę uwierzyć, że kufy JQuery i hacki CSS są upvoted. To znacznie ładniejsze rozwiązanie. – jozzas

+0

Głosowałbym na to, ale pozostawia ukryte pola. Bardziej kompletne rozwiązanie z @emispowder. –

37

Oraculum ma rację. Nie powinieneś tego czyścić po stronie klienta. Jeśli jest to bałagan, to nie powinieneś w ogóle wysyłać go do klienta. Opierając się na odpowiedzi Oraculum, powinieneś użyć niestandardowego szablonu formularza, ponieważ prawdopodobnie nadal chcesz ukryć wartości w formularzu.

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

Używanie niestandardowego szablonu formularza do kontrolowania ukrytych pól jest czystsze, ponieważ nie wysyła nieistotnych informacji do klienta.

2

Teoretycznie powinieneś móc przekazać label_suffix do konstruktora formularzy. Jednak administrator Django ignoruje to.

Zostałaś ugryziona przez dwa błędy w Django: #18134 'BoundField.label_tag should include form.label_suffix' (stałe w bagażniku, powinna być w 1.6) oraz w mniejszym stopniu #11277 Hidden fields in Inlines are displayed as empty rows.

Obecnie najlepszym rozwiązaniem jest zastąpienie szablonu zestawu pól administratora. Użyj widgetu HiddenInput, a następnie zastąp szablon szablonu zestawu pól (documented here). Wystarczy utworzyć templates/admin/includes/fieldset.html z następujących treści:

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

oparciu roztworu przez Wilfried Hughes I „ve zmieniła fieldset.html z małych ulepszeń.

Poniższy fragment kodu nie tylko ukrywa element wejściowy, jeśli zestaw pól zawiera tylko jeden element, którego typ-wejściowy jest ustawiony jako ukryty, ukrywa również otaczające elementy div, które nie tracą miejsca w formularzu.

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

+0

Po prostu dodaj do tego pomocnego wpisu przez lacki. Uważam, że ten szablon dotyczy wersji 1.6. @Lacki, czy możesz zweryfikować? – mkoistinen

0

Poniższa usuwa ':' ze wszystkich pól formularza. Próbowałem tylko tego z klasą forms.Form, ale uważam, że powinno działać również dla forms.ModelForm.

W formularzach Django ":" po etykietach to label_suffix. Możesz zmienić lub usunąć label_suffix, tworząc podklasę o nazwie ModelForm, o nazwie UnstyledForm, i przedefiniowując funkcję inicjalizacji z label_suffix ustawioną na pusty ciąg. Następnie użyj nowej klasy 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()) 

Mam nadzieję, że to pomoże!

0

Innym sposobem, aby to zrobić, ale myślę, że nadal lepiej jest iterować formularz form.visible_fields &.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> 
Powiązane problemy