繁体   English   中英

基于 model 多选字段在模板 django 中显示结果

[英]Based on model multiselectfield show result in template django

基于多项选择字段,我想在模板中显示结果,但我不知道该怎么做,正如您在此 model 中看到的那样,我根据午餐选择为学生提供午餐选择我想显示结果,但它不适用于 ex if他 select 三明治提交后的结果你的三明治会准备好和其他人一样吗

from multiselectfield import MultiSelectField
class student(models.Model):
    lunch_choice = [ 
        ('Sandwich', 'Sandwich'),
        ('Salad', 'Salad'),
        ('omlete', 'omlete'),
    ]
    name = models.CharField(max_length=70, blank=False)
    classs =  models.CharField(max_length70, blank=True)
    lunch =  MultiSelectField(choices=lunch_choice, blank=True)

    def __str__(self):
        return self.name

我在我的 HTML 中试过,但没有用

{% if student.classs %}
{% if student.lunch == 'Sandwich' %}
          <p> your sandwich will be ready</p>
{% endif %} 
{%endif%}

并在 form.py 中使用小部件

widgets = {
    'lunch':forms.CheckboxSelectMultiple(attrs={'id':'lunch'}),
}

我的意见.py

def preview(request):
    student = student.objects.all()
    return render(request, 'preview.html',{'student':student})

OP 可以为午餐创建一个 model(它可以创建新的午餐,编辑和删除)。 然后,在 Student model 中使用ManyToManyField创建午餐,例如

lunch = models.ManyToManyField(Lunch, blank=True)

注意使用blank=True不需要 forms 中的字段。

然后,当一个基于 model 的表单生成一个表单时,它会创建一种类似于 Django Admin 中的体验,其中一个可以 select 多个。

然后可以在模板中向用户展示它


如果一个人不喜欢表单的体验并希望使其更加用户友好,那么有一些文章解释了这一点

发生这种情况是因为字符串正在与类型进行比较:type(aaa[0].lunch) <class 'multiselectfield.db.fields.MSFList'>。 打印视图中数据库中第一个值的数据类型“type(aaa[0].lunch)”。 使用 stringformat:'s' 将数据转换为模板中的字符串。 在这里您可以阅读有关转换的信息: conversion

转换类型:

将“samplesite”替换为您的应用程序的名称。

网址.py

urlpatterns = [
   path("Test/", Test, name = 'Test'),
]

视图.py

def Test(request):
    aaa = student.objects.all()
    print('type(aaa[0].lunch)', type(aaa[0].lunch))
    context = {'fff': aaa}

    return render(request, 'samplesite/lunch.html', context)

午餐.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
</head>
<body>
    {% for aa in fff %}
    {% if  aa.lunch|stringformat:'s' == 'Sandwich' %}
    <p>{{aa.lunch}}</p>
    <p>{{aa.name}}</p>
    {% endif %}
    {% endfor %}
</body>
</html>

settings.py 中的设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }

django 4.1版在此处输入图像描述

对我来说,没有这样的方法可以根据所选选项显示结果,因为我也尝试使用它并在互联网上寻找答案,但没有找到任何东西,并且该回购协议的创建者也没有回应,尽管我会建议您使用模型多对多字段它将允许用户使用 select 多个选项,例如这样的多选字段

首先,创建模型

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

    def __str__(self):
        return self.title

然后将其添加到学生模型中

lunch =  models.ManyToManyField(Lunch, blank=True, related_name="lunch")

然后在午餐 model 中添加您的选项

并在您的模板中显示基于所选选项的结果

{% if student.classs %}
{% for Lunch in student.lunch.all %}
{% if Lunch.title == 'Sandwich' %}
          <p> your sandwich will be ready</p>
{% endif %}
{% endfor %} 
{%endif%}

它会起作用的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM