gpt4 book ai didi

python - 如何为 django QuerySet 的每个条目添加一些上下文

转载 作者:行者123 更新时间:2023-11-28 18:35:38 28 4
gpt4 key购买 nike

我使用 Django 1.8.4 和 Python 3.4

我有一个锦标赛模型,它定义了一个方法,如果禁止订阅则返回一个字符串。

class Tournament(models.Model):
name = models.CharField(max_length=200, null=True, blank=True)
subscriptions = models.ManyToManyField('ap_users.Profile')
is_subscription_open = models.BooleanField(default=True)
# ...

def why_subscription_impossible(self, request):
if not request.user.profile.is_profile_complete():
return 'Your profile is not complete'
elif not self.is_subscription_open:
return 'Subscriptions are closed'
elif <another_condition>:
return 'Another error message'

return None

我想使用通用的 ListView 显示锦标赛列表,我想使用该方法的结果来修改它的显示方式:

<table class="table">
<thead>
<td>Tournament</td>
<td>Subscription</td>
</thead>
{% for tournament in tournament_list %}
<tr>
<td>{{ tournament.name }}</td>
<td>
{% if tournament.why_subscription_impossible %}
{{ tournament.why_subscription_impossible }}
{% else %}
<a href="{% url 'ap_tournament:subscribe' tournament.id %}">Subscribe</a>
{% endif %}
</td>
</tr>
{% endfor %}
</table>

该 View 是继承自 generic.ListView 的基于类的通用 View 。

class IndexView(generic.ListView):
template_name = 'ap_tournament/index.html'

def get_queryset(self):
return Tournament.objects.all()

显示的解决方案不起作用,因为我需要传递当前请求,以获取有关已登录用户的信息。所以我尝试将方法的结果添加到 View 中的上下文中

class IndexView(generic.ListView):
template_name = 'ap_tournament/index.html'

def get_queryset(self):
return Tournament.objects.all()

def get_context_data(self, **kwargs):
context = super(IndexView, self).get_context_data(**kwargs)

additional_ctx_info = []
for tournament in self.get_queryset():
additional_ctx_info.append({
'reason_to_not_subscribe': tournament.why_subscription_impossible(self.request)
})

context['subscr_info'] = additional_ctx_info
return context

显然,这也行不通。我不知道如何使用 tournament_list 中的当前索引访问 subscr_info[n]。我知道 forloop.counter0 可以获取索引,但我不能在模板中使用它(或者我不知道如何使用)。我试过了:

  • {{ subscr_info.forloop.counter0.reason_to_not_subscribe }}
  • {{ subscr_info.{{forloop.counter0}}.reason_to_not_subscribe }}

我也尝试在 get_queryset() View 方法中注释 QuerySet 并阅读有关 aggregate() 的内容,但我觉得它只适用于数据库支持的操作(AVG、COUNT、MAX 等)。

我还觉得在我的情况下使用过滤器或模板标签不起作用,因为我需要在 if 标签中使用该方法的结果。

是否有更好的解决方案或完全不同的方法来实现我想要的?

最佳答案

在您看来,您还可以:

tournaments = self.get_queryset()
for tournament in tournaments:
tournament.reason_to_not_subscribe = tournament.why_subscription_impossible(self.request)

然后将 tournaments 添加到上下文中。

关于python - 如何为 django QuerySet 的每个条目添加一些上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32683954/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com