2017-05-24 1 views
1

Bonjour, je suis actuellement nouveau sur django/wagtail. Je travaille sur une page à propos de mon travail et de mes positions actuelles et précédentes. J'ai fait les positions streamfield blocks car la quantité d'expérience n'est pas limitée. Voici le code de mes modèles.Rendu streamfield bloquer d'une certaine manière si booleanBlock est vrai

#Create experience block 
class ExperienceBlockStruct(StructBlock): 
    position_title = CharBlock(help_text="Enter a previous position title.") 
    description = CharBlock(help_text="Job description") 
    current_position = BooleanBlock(required=False, help_text="Check if 
    current position") 

class Meta: 
    template = 'blocks/experience_block.html' 


class ExperienceBlock(StreamBlock): 
    experience = ExperienceBlockStruct(icon="form") 

Et voici la page où j'utilise les modèles

class About(Page): 
    profile_pic = "some image reduced code bc it currently works" 
    bio = RichTextField(blank=True) 
    resume = "some document reduced code bc it currently works" 
    experience = StreamField(ExperienceBlock()) 
    content_panels = Page.content_panels + [ 
     ImageChooserPanel('profile_pic'), 
     FieldPanel('bio'), 
     DocumentChooserPanel('resume'), 
     StreamFieldPanel('experience'), 
    ] 

Maintenant, la question que je vais avoir est de savoir comment rendre les blocs dans lesquels les current_position = True dans une autre région que ceux qui ne sont pas. J'ai essayé

templates/about.html 
{% for block in page.experience %} 
    {% if block.current_position %} 
    {% include_block block %} 
    {% endif %} 
{% endfor %} 

Mais qui ne marche pas quoi que ce soit rendu. J'ai aussi essayé de

<div class="experience"> 
    {% if value.current_position %} 
    {{ value.position_title }} 
    {% else %} 
    {{ value.position_title }} 
    {% endif %} 
</div> 

mais qui crée une nouvelle div pour chaque bloc. Ce que je voudrais réaliser quelque chose comme dans blocks/experience_block.html

<div> 
    Current position(s): {% blocks with current_postion == True %} 
</div> 

<div> 
    Past position(s): {% blocks with current_postion == False %} 
</div> 

Comment pourrais-je aller sur la réalisation de quelque chose comme ça?

Répondre

0

Votre premier extrait de modèle était presque correct - il vous suffit de vérifier block.value.current_position plutôt que block.current_position:

{% for block in page.experience %} 
    {% if block.value.current_position %} 
     {% include_block block %} 
    {% endif %} 
{% endfor %} 

En effet, en boucle sur page.experience vous donne une série de BoundBlock objets qui vous indiquent la block_type (toujours 'experience' dans votre cas) à côté de la valeur du bloc. Voir BoundBlocks and values pour une explication plus détaillée.

Vous pouvez faire la même chose dans votre modèle de experience_block.html (en utilisant {% for block in value %} plutôt que {% for block in page.experience %}) - bien qu'il faille noter que la définition du modèle Meta doit aller sur ExperienceBlock plutôt que ExperienceBlockStruct, parce que c'est celui qui a accès à la pleine liste à faire défiler, plutôt qu'un seul enregistrement.

Pour rendre les choses plus propre, je vous suggère de définir une méthode get_context sur le bloc, de sorte que vous faites la manipulation de données dans le code Python plutôt que dans le modèle ...

class ExperienceBlock(StreamBlock): 
    experience = ExperienceBlockStruct(icon="form") 

    def get_context(self, value, parent_context=None): 
     context = super(ExperienceBlock, self).get_context(value, parent_context=parent_context) 
     context['current_positions'] = [block for block in value if block.value.current_position] 
     context['past_positions'] = [block for block in value if not block.value.current_position] 
     return context 

    class Meta: 
     template = 'blocks/experience_block.html' 

Cette volonté rendre les variables current_positions et past_positions disponibles sur le modèle.