【问题标题】:How to pass request in forms.BooleanField to get the data from database in Django?如何在 forms.BooleanField 中传递请求以从 Django 中的数据库中获取数据?
【发布时间】:2021-09-07 19:12:22
【问题描述】:

我使用forms.BooleanField 进行复选框过滤。我一直无法从数据库中获取数据。

含义:如果用户点击SAMSUNG 产品,数据应过滤所有SAMSUNG 产品。

好吧,我已经尝试从数据库中获取品牌列表,并且效果很好,但是当我单击特定品牌时,它不会过滤特定品牌。 (它只是刷新并显示相同的数据

Code goes here:

forms.py

class BrandForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        brands = Product.objects.filter(category=1).values_list('brand', flat=True)
        for brand in brands:
            self.fields[f'{brand}'] = forms.BooleanField(label=f'{brand}', required=False)

views.py

def product(request):
    product = Product.objects.all().order_by('-id')
    formBrand = BrandForm()
          
    return render(request, 'list/product.html', 
    {'product': product, 'formBrand':formBrand}
    )

index.html

<form action="{% url 'main:product' %}" method="get">
            {{ formBrand.as_p }}
            <input type="submit" value="OK">
          </form>

所有代码都应该实现什么?

编辑 1

models.py

class Product(models.Model):
    name = models.CharField(max_length=1330)
    title = models.CharField(max_length=1330)
    image_src = models.URLField(max_length=1330,null=True, blank=True)
    link_href = models.URLField(max_length=1330,null=True, blank=True)
    brand = models.CharField(max_length = 1330, null=True, blank=True)
    price = models.DecimalField(max_digits=15, decimal_places=2)
    category = models.IntegerField(default=1, choices=PRODUCT_CHOICES)
    created = models.DateTimeField(auto_now_add=True)

【问题讨论】:

  • 你能分享这个main:productdata的观点吗?
  • GET 请求无法获取表单数据,改为使用 POST 方法
  • 你好@Arjun,它只是main:product

标签: django forms django-views django-forms django-templates


【解决方案1】:

我认为您以错误的方式处理表单,首先您需要使用 POST 方法从表单中获取数据,然后根据表单中的选择过滤产品并重新呈现页面。

所以表格应该是:

<form action="{% url 'main:productdata' %}" method="POST">
            {{ formBrand.as_p }}
            <input type="submit" value="OK">
          </form>

在你看来:

def product(request):
    product = Product.objects.all().order_by('-id')
    if request.method == 'GET':
        formBrand = BrandForm()
    elif request.method == 'POST':
        formBrand = BrandForm(request.POST)
        if formBrand.is_valid():
           brand_names = []
           # get list of brand name as form name
           for brand_name in formBrand.cleaned_data:
              if formBrand.cleaned_data[brand_name] == True:
                 brand_names.append(brand_name)
           if brand_names:
              product = Product.objects.filter(brand__in=brand_names).order_by('-id')
          
    return render(request, 'list/product.html', 
    {'product': product, 'formBrand':formBrand}
    )

【讨论】:

  • 首先,我运行这段代码,我得到一个错误CSRF verification failed. Request aborted。之后我输入&lt;form...&gt;{% csrf_token %} ... &lt;/form&gt; 然后它什么也没显示
  • 表示点击SAMSUNG复选框后没有o/p(空白页)
  • 我已插入我的models.py
  • @santoshChauhan 尝试打印出formBrand.is_valid(): 看看表格是否有效,或者检查您是否将表格发送到正确的路线
  • [25/Jun/2021 09:53:01] "POST /product/ HTTP/1.1" 200 5559 我在 vs 代码中得到了这个 terminal
猜你喜欢
  • 2017-10-08
  • 2016-03-09
  • 2023-03-06
  • 2020-05-26
  • 1970-01-01
  • 2018-11-10
  • 2018-03-11
  • 2020-10-31
  • 1970-01-01
相关资源
最近更新 更多