如何从数据库中创建一个django表单

jslywgbw  于 2023-06-25  发布在  Go
关注(0)|答案(3)|浏览(124)

我有一个带有下拉菜单的侧边栏,上面有分类和菜肴。我想为精选菜肴创建一个复选框
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>

但我不明白如何将菜名传递到表单以将其链接到标签

ndh0cuux

ndh0cuux1#

首先,您需要创建一个Basket,而不是Dish。因此将其重命名为BasketForm而不是DishForm。要从多个现有型号中选择一个型号,您需要使用ModelChoiceField
既然你说你想有复选框,你应该把默认的Selectwidget改为RadioSelect

class BasketForm(ModelForm):
    class Meta:
        model = Basket
        fields = ['dish']
        widgets = forms.ModelChoiceField(
                queryset=Dish.objects.all(), 
                widget=forms.RadioSelect
        )

那么表单的默认模板就足够了。这将显示一个单选按钮(复选框),您可以在其中从所有Dish对象中选择一个。

<form action="." method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>

在表单中定义查询集已经有些静态了。如果你想有一个不同的选择范围为Dish es为不同的意见或用户或任何你想修改它通过__init__()方法的形式。

2nbm6dog

2nbm6dog2#

<form method="post">{{ form.dish }}重叠。你有一个形式在另一个形式基本上。渲染的版本看起来像这样:

<form method="post">
...
     <form method="post">
     </form>
...
</form>

无论如何,我认为这不是正确的方法。考虑到您一次只能提交一个表单。因此,您应该有一个父窗体,然后呈现字段。您可以手动执行此操作:

<form method="post">
    {% csrf_token %}
    {% for dish in dishes %}
        <label for="{{ dish.id }}">{{ dish.name|title }}</label>
        <input type="check" name="{{ dish.name }}" id="{{ dish.id }}" />
    {% endfor %}
    <input type="submit">Submit</input>
</form>
7gyucuyw

7gyucuyw3#

非常感谢你的回答。但显然我是个很蠢的人。我的问题不是通过一个表单,而是通过一个按钮来解决的。如果您点击按钮,菜被添加,如果菜已经在篮子里-它被删除。

相关问题