2017-06-20 3 views
1

J'utilise un formset pour mettre à jour une liste de propriétés d'un ingrédient.Django: comment accéder à l'instance de l'ensemble de requêtes dans la mise en page de FormHelper

IngredientFormSet = modelformset_factory(Ingredient, form=IngredientForm, extra=0) 

formset = IngredientFormSet(queryset=ingredients_dictinct) 
# I am passing a list of ingredients as queryset 

helper = RecipeIngredientFormSetHelper() 

Ma forme de code d'aide est:

class RecipeIngredientFormSetHelper(FormHelper): 
    def __init__(self, *args, **kwargs): 
     super(RecipeIngredientFormSetHelper, self).__init__(*args, **kwargs) 
     self.form_method = 'post' 
     self.layout = Layout(
      Div(
       Div(HTML("{{ forloop.counter }}"), 
        css_class='col-xs-2', style='text-align:center'), 
       Div('name', css_class='col-xs-2',), 
       Div('munit', css_class='col-xs-2',), 
       Div('rate', css_class='col-xs-2',), 
       Div('typeofingredient', css_class='col-xs-2',), 
       Div('density_kg_per_lt', css_class='col-xs-2',), 
       Div('density_pcs_per_kg', css_class='col-xs-1',), 
       Div('density_pcs_per_lt', css_class='col-xs-1',), 
       css_class='row',style="border-top:1px solid;padding-top:20px") 
      ) 
     self.add_input(Submit("submit", "Save")) 
     self.render_required_fields = True 

Dans le self.layout en utilisant HTML(), comment montrer des propriétés de l'objet ingrédient

Comment accéder à l'ingrédient passé dans la queryset dans la mise en page

Par exemple:

self.layout = Layout(
       Div(
        Div(HTML("{{ forloop.counter }}"), 
         HTML("{{ ingredient.somemodelmethod }}"), 
         css_class='col-xs-2', style='text-align:center'), 

Répondre

0

J'ai été aux prises avec le même problème. La solution que j'ai implémentée était de créer un champ qui restitue sa valeur en texte brut.

  1. Ajouter un champ de formulaire de plain_text au formulaire modèle

  2. Mettre en œuvre un widget personnalisé pour rendre la saisie de texte en texte brut

  3. Définir la valeur du champ plain_text dans le formulaire d'initialisation

  4. Utilisez le champ plain_text dans le FormHelper au lieu de HTML

    from django.utils.safestring import mark_safe 
    class PlainTextWidget(forms.Widget): 
        def render(self, name, value, attrs=None): 
         return mark_safe(value) if value is not None else '-' 
    
    class IngredientForm(forms.ModelForm): 
        plain_text = forms.CharField(widget=PlainTextWidget,required=False) 
        .... 
    
        def __init__(self, *args, **kwargs): 
         super(IngredientForm, self).__init__(*args, **kwargs) 
         self.initial['plain_text'] = self.instance.somemodelmethod() 
    
    
    self.layout = Layout(
        Div(
         Div(
          HTML("{{ forloop.counter }}"), 
          Field('plain_text'), 
    
+0

Cela faisait longtemps que je l'ai fait. Je vais vérifier la solution –