2012-02-17 12 views
12

ho il seguente, ma perché questo non nasconde l'etichetta per il commento del libro? Ottengo l'errore 'campo di testo' non è definito:Django: come nascondere/sovrascrivere l'etichetta predefinita con ModelForm?

from django.db import models 
from django.forms import ModelForm, Textarea 

class Booklog(models.Model): 
    Author = models.ForeignKey(Author) 
    Book_comment = models.TextField() 
    Bookcomment_date = models.DateTimeField(auto_now=True) 

class BooklogForm(ModelForm): 
    #book_comment = TextField(label='') 

    class Meta: 
     model = Booklog 
     exclude = ('Author') 
     widgets = {'book_entry': Textarea(attrs={'cols': 45, 'rows': 5}, label={''}),} 
+0

forse non nascondere, ma modificare l'etichetta a nulla? – thedeepfield

+0

Hai importato forms.TextField? – Alasdair

+0

Non l'ho fatto, ho solo da django.forms import ModelForm, Textarea. quando provo ad aggiungere ", TextField" ottengo un errore di importazione ... – thedeepfield

risposta

16

Per espandere il commento sopra, non esiste un campo di testo per i moduli. Questo è ciò che ti dice l'errore TextField. Non ha senso preoccuparsi dell'etichetta finché non si dispone di un campo modulo valido.

La soluzione è utilizzare forms.CharField invece, con un widget Textarea. È possibile utilizzare l'opzione dei widget del modulo del modello, ma è più semplice impostare il widget quando si definisce il campo.

Una volta che hai un campo valido, sai già come impostare un'etichetta vuota: basta usare l'etichetta = '' nella definizione del campo.

# I prefer to importing django.forms 
# but import the fields etc individually 
# if you prefer 
from django import forms 

class BooklogForm(forms.ModelForm): 
    book_comment = forms.CharField(widget=forms.Textarea, label='') 

    class Meta: 
     model = Booklog 
     exclude = ('Author',) 
1

L'attributo exclude prende un iterabile (di solito una lista o tupla). Ma ('book') non è una tupla; è necessario aggiungere una virgola per renderla una tupla, a causa di un capriccio della sintassi di Python: exclude = ('book',).

Per questo motivo, di solito utilizzo solo elenchi: exclude = ['book']. (Semanticamente, ha più senso usare gli elenchi qui in ogni caso, ma non so perché la documentazione di Django incoraggia invece l'uso di tuple.)

+0

Credo che la documentazione di Django raccomandi le tuple perché poiché i valori di esclusione non cambierebbero, non ha senso avere una lista (che è mutabile). Le liste sono più grandi delle tuple a causa di quella proprietà mutevole. a = ('a',), b = ['a'] quindi usa il metodo __ sizeof __ e controlla le dimensioni ;-) – markuz

+0

voglio solo che l'etichetta sia vuota, sto seguendo esattamente i documenti e sono in grado di sovrascrivere l'etichetta predefinita ... – thedeepfield

+0

@markuz: presumo che sia il caso, ma continuo a pensare che sia sbagliato, poiché le tuple non sono solo elenchi immutabili. – mipadi

0

Prima di tutto, hai inserito il campo nella classe Meta. Deve andare sul reale ModelForm. In secondo luogo, ciò non avrà comunque il risultato desiderato. Stamperà semplicemente un elemento etichetta vuoto nel codice HTML.

Se si desidera rimuovere completamente l'etichetta, sia controllare manualmente per il campo e non mostrare l'etichetta:

{% for field in form %} 
    {% if field.name != 'book_comment' %} 
    {{ field.label }} 
    {% endif %} 
    {{ field }} 
{% endfor %} 

Oppure utilizzare JavaScript per rimuoverlo.

5

Per ignorare solo l'etichetta che si può fare

def __init__(self, *args, **kwargs): 
    super(ModelForm, self).__init__(*args, **kwargs) 
    self.fields['my_field_name'].label = 'My New Title' 
Problemi correlati