2016-03-19 1 views
1

Ich benutze knusprige Formen 1.6 mit Django 1.9 und Python 3.4.Wie können Sie mit der Methode "django crispy" in der Methode "Field" des Layout-Objekts "extra_context" festlegen?

Wenn ich die Field-Klasse mit einem Layout verwende, kann der extra_context nicht funktionieren. Die Werte werden nicht in den Kontext injiziert.

Die folgende Vorlage gibt den "Schwellenwert" -Wert nicht aus.

Hier ist mein Formularcode.

# project_edit_form.py 
from django import forms 
from django.contrib.auth.models import Group 
from .models import Projects 
from crispy_forms.helper import FormHelper 
from crispy_forms.layout import Layout, HTML 

class ProjectEditForm(forms.ModelForm): 

    class Meta: 
     model = Projects 
     fields = ('project_description', 'location', 'days_elapsed',) 

    def __init__(self, *args, **kwargs): 
     self.helper = FormHelper() 
     # ... 
     self.helper.layout = Layout(
     Fieldset(
      'Project', 
      'project_description', 
      'location', 
      Field('days_pge_first_responded', template="days_elapsed_field.html", extra_context={"threshold":15})%}"), 
     ), 
    ) 
    super(ProjectEditForm, self).__init__(*args, **kwargs) 

Und hier ist die HTML-Vorlage für das Feld:

# days_elapsed_field.html 
extra_context.threshold: {{ extra_context.threshold }} 
threshold: {{ threshold }} 
field.threshold: {{ field.threshold }} 

<div id="div_id_{{ field_name }}" class="form-group"> 
    <label for="{{ field.id_for_label }}" class="control-label"> {{ field.label }} </label> 
    <div > 
     <input 
      style="{% if field.value > threshold %} background-color:#FFE8E8; {% else %} background-color:#e3e3e3 {% endif %}" 
      class="textinput textInput form-control" id="{{ field.id}}" name="{{ field.name}}" readonly="True" type="text" value="{{ field.value }}" /> 
    </div> 
</div> 

Und hier ist die Haupt HTML-Template:

{% load crispy_forms_tags %} 
<!doctype html> 
<html> 
    <head>...</head> 
    <body> 
     <form action="" method="post" class="form-horizontal" > 
      {% crispy form %} 
     </form> 
    </body> 
</html> 

Antwort

0

ich keine integrierte Möglichkeit, herauszufinden, könnte Ich habe einfach eine generische Klasse erstellt und stattdessen verwendet. Sie können extra_context als kwarg an CustomCrispyField übergeben. extra_context ist nur ein Wörterbuch, auf das ich in meiner benutzerdefinierten Vorlage zugreife, die ich von crispy_forms kopiert habe.

from crispy_forms.layout import Field 
from crispy_forms.utils import TEMPLATE_PACK 


class CustomCrispyField(Field): 
    extra_context = {} 

    def __init__(self, *args, **kwargs): 
     self.extra_context = kwargs.pop('extra_context', self.extra_context) 
     super(CustomCrispyField, self).__init__(*args, **kwargs) 

    def render(self, form, form_style, context, template_pack=TEMPLATE_PACK, extra_context=None, **kwargs): 
     if self.extra_context: 
      extra_context = extra_context.update(self.extra_context) if extra_context else self.extra_context 
     return super(CustomCrispyField, self).render(form, form_style, context, template_pack, extra_context, **kwargs) 

Und ich würde es so verwenden, so in meiner Form:

self.helper.layout=Div(CustomCrispyField('my_model_field', css_class="col-xs-3", template='general/custom.html', extra_context={'css_class_extra': 'value1', 'caption': 'value2'}) 

Und meine Vorlage würde ähnlich haben Code wie folgt:

{% crispy_field field %} 
<button class="btn {{ css_class_extra }}">{{ caption }}</button> 
Verwandte Themen