2012-02-17 42 views
12

tengo lo siguiente, pero ¿por qué esto no oculta la etiqueta para el comentario del libro? Me sale el error 'campo de texto' no está definido:Django: cómo ocultar/sobrescribir la etiqueta predeterminada 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

puede que no oculta, sino cambiar la etiqueta a la nada? – thedeepfield

+0

¿Ha importado forms.TextField? – Alasdair

+0

No lo hice, solo tengo de django.forms import ModelForm, Textarea. cuando trato de agregar ", TextField" recibo un error de importación ... – thedeepfield

Respuesta

16

Para ampliar mi comentario anterior, no hay un Campo de texto para formularios. Eso es lo que su error de TextField le está diciendo. No tiene sentido preocuparse por la etiqueta hasta que tenga un campo de formulario válido.

La solución es usar forms.CharField en su lugar, con un widget Textarea. Puede usar la opción de widgets de formulario modelo, pero es más sencillo establecer el widget al definir el campo.

Una vez que tiene un campo válido, ya sabe cómo configurar una etiqueta en blanco: simplemente use la etiqueta = '' en su definición de 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

exclude El atributo toma un iterable (por lo general una lista o tupla). Pero ('book') no es una tupla; necesita agregar una coma para convertirla en una tupla, debido a una peculiaridad de la sintaxis de Python: exclude = ('book',).

Por esta razón, suelo usar listas: exclude = ['book']. (Semánticamente, tiene más sentido usar listas aquí de todos modos; no estoy seguro de por qué la documentación de Django alienta el uso de tuplas en su lugar.)

+0

Creo que la documentación de Django recomienda tuplas porque como los valores de exclusión no cambiarían, no tiene sentido tener una lista (que es mutable). List son más grandes que las tuplas debido a esa propiedad mutable. a = ('a',), b = ['a'] luego use el método __ sizeof__ y compruebe el tamaño ;-) – markuz

+0

solo quiero que la etiqueta esté en blanco, sigo los documentos exactamente y soy capaz de anular la etiqueta predeterminada ... – thedeepfield

+0

@markuz: supongo que ese es el caso, pero todavía creo que está mal, ya que las tuplas no son solo listas inmutables. – mipadi

0

En primer lugar, pones el campo en la clase Meta. Tiene que ir en el actual ModelForm. En segundo lugar, eso no tendrá el resultado deseado de todos modos. Simplemente imprimirá un elemento de etiqueta vacío en el HTML.

Si desea eliminar por completo la etiqueta, o bien comprobar manualmente el campo y no muestran la etiqueta:

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

O usar JavaScript para eliminarlo.

5

Para sustituir simplemente la etiqueta que puede hacer

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