我有一个带有下拉菜单的侧边栏,上面有分类和菜肴。我想为精选菜肴创建一个复选框
models.py
class Category(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Dish(models.Model):
category = models.ForeignKey(to=Category, related_name="children", on_delete=models.SET_NULL, null=True)
name = models.CharField(max_length=500)
weight = models.IntegerField()
cost = models.IntegerField()
def __str__(self):
return self.name
class Basket(models.Model):
user = models.ForeignKey(to=User, on_delete=models.SET_NULL, null=True)
dish = models.ForeignKey(to=Dish, on_delete=models.SET_NULL, null=True)
quantity = models.PositiveSmallIntegerField(default=1)
created_timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'Dishes: {self.dish.name} | Manager: {self.user.name}'
在HTML格式中,它看起来像这样:
<div class="filter-content collapse show" id="collapse_1" style="">
<ul class="list-unstyled ps-0">
{% if category %}
{% for cat in category %}
<li class="mb-1">
<button class="btn btn-toggle d-inline-flex align-items-center rounded border-0 collapsed" data-bs-toggle="collapse" data-bs-target="#{{ cat.id }}" aria-expanded="false">
{{ cat.name }}
</button>
{% for dish in cat.children.all %}
<div class="collapse" id="{{ cat.id }}" style="">
<ul class="btn-toggle-nav list-unstyled fw-normal pb-1 small">
<li>
<div class="list-group list-group-checkable d-grid gap-2 border-0">
<input class="list-group-item-check pe-none" type="checkbox" name="listGroupCheckableRadios" id="{{dish.name}}" value="">
<label class="list-group-item rounded-3 py-3" for="{{dish.name}}">
{{dish.name}}
</label>
</div>
</li>
</ul>
</div>
{% endfor %}
</li>
{% endfor %}
{% else %}
<p>no values</p>
{% endif %}
</ul>
</div>
为了处理单击复选框的操作,我创建了一个表单:
class DishForm(ModelForm):
class Meta:
model = Basket
fields = ['dish']
widgets = {"dish": CheckboxInput(attrs={
'class': 'list-group-item-check pe-none',
'type': 'checkbox',
})
}
并将此表单添加到html
<div class="filter-content collapse show" id="collapse_1" style="">
<ul class="list-unstyled ps-0">
{% if category %}
{% for cat in category %}
<li class="mb-1">
<button class="btn btn-toggle d-inline-flex align-items-center rounded border-0 collapsed" data-bs-toggle="collapse" data-bs-target="#{{ cat.id }}" aria-expanded="false">
{{ cat.name }}
</button>
{% for dish in cat.children.all %}
<div class="collapse" id="{{ cat.id }}" style="">
<ul class="btn-toggle-nav list-unstyled fw-normal pb-1 small">
<li>
<form method="post">
{% csrf_token %}
<div class="list-group list-group-checkable d-grid gap-2 border-0">
{{ form.dish }}
<label class="list-group-item rounded-3 py-3" for="{{dish.name}}">
{{dish.name}}
</label>
</div>
</li>
</ul>
</div>
{% endfor %}
</li>
{% endfor %}
{% else %}
<p>no values</p>
{% endif %}
</ul>
</div>
但我不明白如何将菜名传递到表单以将其链接到标签
3条答案
按热度按时间ndh0cuux1#
首先,您需要创建一个
Basket
,而不是Dish
。因此将其重命名为BasketForm
而不是DishForm
。要从多个现有型号中选择一个型号,您需要使用ModelChoiceField
。既然你说你想有复选框,你应该把默认的
Select
widget改为RadioSelect
。那么表单的默认模板就足够了。这将显示一个单选按钮(复选框),您可以在其中从所有
Dish
对象中选择一个。在表单中定义查询集已经有些静态了。如果你想有一个不同的选择范围为
Dish
es为不同的意见或用户或任何你想修改它通过__init__()
方法的形式。2nbm6dog2#
<form method="post">
和{{ form.dish }}
重叠。你有一个形式在另一个形式基本上。渲染的版本看起来像这样:无论如何,我认为这不是正确的方法。考虑到您一次只能提交一个表单。因此,您应该有一个父窗体,然后呈现字段。您可以手动执行此操作:
7gyucuyw3#
非常感谢你的回答。但显然我是个很蠢的人。我的问题不是通过一个表单,而是通过一个按钮来解决的。如果您点击按钮,菜被添加,如果菜已经在篮子里-它被删除。