gpt4 book ai didi

django - 在 DetailView 中显示选中和未选中的多对多选项

转载 作者:行者123 更新时间:2023-12-04 07:57:50 26 4
gpt4 key购买 nike

我正在寻找一种优雅的方式来显示 Django 中所有可用的项目(不仅仅是选中的项目)DetailView , 同时对选中的样式进行样式化。
给定以下模型:

class Topping(models.Model):    
title = models.CharField(max_length=200)

class Pizza(models.Model):
topping = models.ManyToManyField(Topping, blank=True, null=True)
我正在使用 CheckboxSelectMultiple 以我的形式呈现浇头(=呈现为多个复选框),例如:
toppings = forms.ModelMultipleChoiceField(
required=False,
queryset=Toppings.objects.all(),
widget=forms.CheckboxSelectMultiple,
)
哪些浇头是 也是相关的不是 被选中,因此我想在我的 DetailView 中渲染一些东西如下所示(选中时显示选中的复选框;未选中时显示空复选框和浅灰色文本,与表单中看到的顺序相同,即在此示例中按字母顺序排列):
Chosen pizza toppings:
☑ Bluecheese
☐ Green peppers
☐ Onions
☑ Red peppers
我目前按如下方式浏览浇头,但这仅显示选定的浇头:
{% for option in object.toppings.all %}☑ {{ option }}<br />{% endfor %}
我有一大堆不同的 ManyToManyField在我的主要模型上。

最佳答案

您可以通过 DetailView用 bool 值注释的浇头确定 Topping s 已被选中。例如,我们可以使用 Exists subquery [Django-doc] 来做到这一点。 :

from django.db.models import Exists, OuterRef
from django.views.generic import DetailView

class PizzaDetailView(DetailView):
model = Pizza
# …

def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
item = self.object
context['toppings'] = Topping.objects.annotate(
has_topping=Exists(
Pizza.topping.through.objects.filter(
topping_id=OuterRef('pk'),
pizza_id=self.object.pk
)
)
)
return context
然后在模板中,您可以使用以下命令进行渲染:
{% for topping in toppings %}
{% if topping.has_topping %}&#x2611;{% else %}&#x2610;{% endif %} {{ topping }}<br/>
{% endfor %}

关于django - 在 DetailView 中显示选中和未选中的多对多选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66612807/

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