簡體   English   中英

ListView(django)中的get_context_data問題

[英]problems with get_context_data in ListView (django)

我需要在模板中顯示兩個模型:

模型.py:

class Dimension(TimeStampedModel):

    level = models.ForeignKey('Level', verbose_name=_('Level'), on_delete=models.CASCADE)
    name = models.CharField(verbose_name=('Name'), max_length=200)
    active = models.BooleanField(verbose_name=_('Active'), default=True)
    sort_order = models.PositiveIntegerField(verbose_name=_('sort order'), default=0)

    class Meta:
        verbose_name = _('Dimension')
        verbose_name_plural = _('Dimensions')
    
    def __str__(self):
        return self.name

class Subdimension(TimeStampedModel):

    dimension = models.ForeignKey('Dimension', verbose_name=_('Dimension'), on_delete=models.CASCADE)
    name = models.CharField(verbose_name=('Name'), max_length=200)
    active = models.BooleanField(verbose_name=_('Active'), default=True)
    sort_order = models.PositiveIntegerField(verbose_name=_('sort order'), default=0)

    objects = managers.SubdimensionManager()
    
    class Meta:
        verbose_name = _('Subdimension')
        verbose_name_plural = _('Subdimensions')
    
    def __str__(self):
        return self.name

並創建了一個 ListView

視圖.py

class DimensionListView(generic.ListView):
    model = models.Dimension
    template_name = 'dimension.html'
    context_object_name = 'dimensions'


    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
        self.user = self.request.user
        self.level = self.get_level(pk=kwargs.get('level_pk'))         
        return super(DimensionListView, self).dispatch(request, *args, **kwargs)

    def get_level(self, pk):
        level = get_object_or_404(models.Level, pk=pk)
        return level

    def get_queryset(self):
        queryset = super(DimensionListView, self).get_queryset()
        return queryset.filter(active = True, level = self.level)

    def get_context_data(self, **kwargs):
        context = super(DimensionListView, self).get_context_data(**kwargs)
        context['subdimensions'] = models.Subdimension.objects.filter(active=True, dimension__level=self.level )
        return context


dimension_list_view = DimensionListView.as_view()

我需要創建一個相同“維度”的過濾器,以便在模板中僅顯示該維度的子維度。

我的模板維度.html:

{% include 'base.html'%}
{% block content %}
<div class="row">
    {% for dimension in dimensions %}
    <div class="col">
        <div class="card" style="width: 18rem;">
        <a class="">{{dimension.name}}</a>
        <div class="card-body"> 
        <ul>
        {% for subdimension in subdimensions %}
        <li>{{subdimension.name}}</li>
        {% endfor %}
        </ul>
        </div> 
        </div>
    </div> 
    {% endfor %}
</div>
{% endblock %}

但如果你注意到,顯示所有卡片中的所有子維度,而不僅僅是這些維度的子維度。

Manager.py 僅返回過濾器 active=True 和 order_by('sort_order') 的對象

你可以用低效的渲染來做到這一點,但如果你有 100-200 個子維度 - 這應該不是問題。

{% for dimension in dimensions %}
<div class="col">
    <div class="card" style="width: 18rem;">
    <a class="">{{dimension.name}}</a>
    <div class="card-body"> 
    <ul>
    {% for subdimension in subdimensions %}
    {% if subdimension.dimension == dimension %}
    <li>{{subdimension.name}}</li>
    {% endif %}
    {% endfor %}
    </ul>
    </div> 
    </div>
</div> 
{% endfor %}

或者,您可以在視圖中使用相應的子維度注釋所有維度。

# views.py
class DimensionListView(generic.ListView):
    ...
    
    def get_queryset(self):
        queryset = super(DimensionListView, self).get_queryset()
        # Save db hits with `prefetch_related`
        return queryset.filter(active = True, level = self.level).prefetch_related('subdimension_set')

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        dims = list(context['dimensions'])
        for d in dims:
            d.all_subdimensions = list(d.subdimension_set.all())
        context['dimensions'] = dims
        return context

然后在模板中

{% for dimension in dimensions %}
<div class="col">
    <div class="card" style="width: 18rem;">
    <a class="">{{dimension.name}}</a>
    <div class="card-body"> 
    <ul>
    {% for subdimension in dimension.all_dimensions %}
    <li>{{subdimension.name}}</li>
    {% endfor %}
    </ul>
    </div> 
    </div>
</div> 
{% endfor %}

(...或者切換到Jinja2模板渲染直接在模板中訪問dimension.subdimension_set.all() )

你也可以看看LoginRequiredMixin而不是method_decorator(login_required)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM