2009-02-20 10 views
5

Quiero mostrar un título y una descripción de una consulta db en cada formulario, pero no quiero que esté en un charfield, quiero que sea texto con formato html.¿Cómo agrego información de texto sin formato a los formularios en un formset en Django?

ejemplo de código de plantilla:

{% for form, data in zipped_data %} 
    <div class="row"> 
     <div class="first_col"> 
     <span class="title">{{ data.0 }}</span> 
     <div class="desc"> 
      {{ data.1|default:"None" }} 
     </div> 
     </div> 
     {% for field in form %} 
     <div class="fieldWrapper" style="float: left; "> 
      {{ field.errors }} 
      {{ field }} 
     </div> 
     {% endfor %} 
{% endfor %} 

¿Es esta la forma más idiomática de hacer esto? O, ¿hay una manera de añadir texto que no se mostrará en el interior de un área de texto o de introducción de texto a mi modelo:

class ReportForm(forms.Form): 
    comment = forms.CharField() 

?

+0

Estoy tratando de agregar un título y una descripción a cada uno de los formularios en el formset, pero no sé cómo hacerlo más que agregando campos de formulario. No quiero agregar más campos de formulario porque no deseo que el título o la descripción aparezcan en un campo de texto, quiero que sea simple o texto con formato html – Josh

+0

Entiendo las plantillas, estoy hablando de las de Django objetos form y formmset: http: //docs.djangoproject.com/es/dev/topics/forms/formsets/ – Josh

+0

Ayuda si actualiza la pregunta en lugar de agregar comentarios. Por favor edite su pregunta para agregar los nuevos hechos. –

Respuesta

10

En lugar de comprimir los formularios con los datos adicionales, puede anular el constructor en su formulario y mantener su título/descripción como variables de miembro de nivel de instancia. Esto es un poco más orientado a objetos y aprender cómo hacerlo te ayudará a resolver otros problemas en el futuro, como campos de elección dinámica.

class MyForm (forms.Form): 
    def __init__ (self, title, desc, *args, **kwargs): 
     self.title = title 
     self.desc = desc 
     super (MyForm, self).__init__ (*args, **kwargs) # call base class 

Luego, en el código de la vista:

form = MyForm ('Title A', 'Description A') 

ajustar en consecuencia si necesita estos valores que venir de la base de datos. Luego, en su plantilla, se accede a las variables de instancia tal como lo hace cualquier otra cosa, por ejemplo:

<h1>{{ form.title }}</h1> 
    <p>{{ form.desc }}</p> 

De la forma en que formul la pregunta, creo que es probable que tenga una cierta confusión en torno a la forma en Django usa Python atributos clase para proporcionar una API de formulario declarativo frente a atributos de nivel de instancia que aplique a instancias individuales de una clase, en este caso, sus objetos de formulario.

+0

Gracias, eso era exactamente lo que necesitaba. – Josh

+0

Sin problema Asegúrese de utilizar la marca de verificación de la solución aceptada para que otros puedan encontrar fácilmente la solución y distribuir algunos puntos de repetición. –

+0

Impresionante, está marcado. – Josh

4

acabo de crear un widget de sólo lectura subclasificando el campo de texto de entrada uno:

class ReadOnlyText(forms.TextInput): 
    input_type = 'text' 

    def render(self, name, value, attrs=None): 
    if value is None: 
     value = '' 
    return value 

Y:

class ReportForm(forms.Form): 
    comment = forms.CharField(widget=ReadOnlyText, label='comment') 
2

Tuve que resolver un problema similar y me gusta tu idea Andrei. Aunque tuve algunos problemas al usarlo, ya que, si hubiera errores de validación, el valor del campo de solo lectura se perdería. Para resolver esto, hice algo similar, pero reemplacé a HiddenInput en su lugar y mantuve el valor en un campo de formulario oculto. es decir:

class ReadOnlyText(forms.HiddenInput): 
    input_type = 'hidden' 

    def render(self, name, value, attrs=None): 
     if value is None: 
      value = '' 
     return mark_safe(value + super(ReadOnlyTextWidget, self).render(name, value, attrs)) 

class ReportForm(forms.Form): 
    comment = forms.CharField(widget=ReadOnlyText, label='comment') 
0

Creo que puede obtenerlo con "{{field.value}}". Tal vez es la manera más fácil.

{% for form in formset %} 
    {% for field in form %} 
     {% if forloop.counter = 1 %} 
      <td><img src="{{ MEDIA_URL }}{{ field.value }}"/></td> 
     {% endif %} 
     {% if forloop.counter = 2 %} 
      <td>{{ field.value }}</td> 
     {% endif %} 
     {% if forloop.counter > 2 %} 
      <td>{{ field }}{{ field.errors }}</td> 
     {% endif %} 
    {% endfor %} 
{% endfor %} 
Cuestiones relacionadas