2016-05-12 129 views
0

我创建了三个选项(主页,更改密码和注销)的菜单。在家中,我显示了存储在数据库中的所有书籍。现在我想使用复选框根据书籍的类别过滤内容。默认情况下,所有图书都会在过滤分类时显示,但只显示该分类的图书。但对于我来说,即使点击所有复选框(复选框包含分类),它也会显示所有图书。我认为存在一些问题在我的模板文件中。如何从django模板中定义的复选框检索值

urls.py,

url(r'^welcome_user/$',views.welcome_user, name='welcome_user'), 

Models.py,

class Add_cat(models.Model): 
    category = models.CharField("Name",max_length=25,unique=True) 

    def __unicode__(self): 
     return u'{0}'.format(self.category) 

class Add_prod(models.Model): 
    book = models.CharField("Book Name",max_length=40) 
    author = models.CharField("Author",max_length=30) 
    price = models.PositiveIntegerField("Price") 
    image = models.ImageField(upload_to='images',null=True) 
    cat = models.ForeignKey(Add_cat,on_delete=models.CASCADE) 

模板文件,

{% block content %} 
{% load staticfiles %} 
<head> 
<link rel="stylesheet" href="{% static 'style.css' %}"> 
</head> 
<body> 
<div class="box"> 
    <div class="sideNav"> 
     <form action="{% url 'welcome_user' %}"> 
      <p id=id3>Categories</p> 
      <hr> 
      {% for i in products %} 
       <input type="checkbox" name="cat_name" value="{{i.cat}}">{{i.cat}}<br> 
      {% endfor %} 
     <button type="submit">Submit</button> 
     </form> 
    </div> 
    <div> 
     {% for i in products %} 
      <div style="display:inline-block;margin:30px"> 
       <img src="{{i.image.url}}" alt="No Image" width=196px height=196px> 
       <p id=id4>Rs.{{i.price}}</p> 
      </div> 
     {% endfor %} 
    </div> 
</div> 
</body> 
{% endblock %} 

Views.py,

@login_required 
def welcome_user(request):  
    if 'cat_name' in request.GET: 
     filter_category = request.GET.getlist('cat_name') 
     my_products = Add_prod.objects.filter(cat__in=filter_category) 
     context = { "products":my_products} 
    else: 
     my_products = Add_prod.objects.all()  
     context = { "products":my_products} 
return render(request,"welcome-user.html",context) 

回答

1

检查是否checbox值在发送表格,您应符合以下条件去

if 'cat_name' in request.GET: 
     #checkbox has been checked 
    else: 
     #it is not checked 

记住in运营商回报boolean所以你也可以做

filter_category = 'cat_name' in request.GET 

中获取价值,你只需要获取值的“cat_name”键,如:

value = request.GET['cat_name'] 

检查它是否在GET参数或不

+0

嘿模板只在点击主菜单时才会调用。当我点击任何类别的模板时不会被调用 – Bhanukiran

+0

如何做滤波器呢?你使用任何js函数吗?你必须为做这个过滤器做一些操作。您可以使用基于复选框选择的js代码执行此过滤器,或者您必须调用后端服务以获取过滤响应。 – Anoop

0

我认为,所有你需要做的就是添加__in到您的过滤器:

@login_required 
def welcome_user(request):  
    filter_category = request.GET.getlist('cat_name') 
    categories = Add_cat.objects.all() 
    if filter_category: # I couldn’t decipher the structure of an `Add_cat`, so I left off the `in` check since it would not work for lists 
     print filter_category 
     my_products = Add_prod.objects.filter(cat__in=filter_category) # the template implies that this field is `cat` and not `category` 
     context = { "products":my_products} 
    else: 
     my_products = Add_prod.objects.all() 
     context = { "products":my_products} 
    return render(request,"welcome-user.html",context) 
+0

嘿模板只在点击主菜单时被调用。当我点击任何类别复选框时,模板没有被调用 – Bhanukiran

0

复选框工作从其他形式的投入一点点不同,所以如果检查从包括一个复选框形式发过帖子,

如果复选框被选中,你的查询集将是这样的: 值将是“上”

所以,你必须检查

if request.POST.get('cb1')=='on': 
     "item is selected" 
    else: 
     "item is not selected" 
+0

经过复选框字段我包括按钮提交域这样,\t now我得到这样的404错误,http://127.0.0.1:8000/welcome_user/%20method%3D?cat_name=Economics – Bhanukiran

+0

我已经在问题中包含了我的url文件。我应该在url中进行任何更改吗? – Bhanukiran

+0

添加方法=发布在表单内,{%csrf_token%}里面的表单内容然后它会直接发布数据到您的意见 – 2016-05-12 12:36:55

0

尝试此以下代码 Add_prod.objects.filter(cat__in = filter_category)

@login_required 
def welcome_user(request):  
    filter_category = request.GET.getlist('cat_name') 

    if filter_category: 

     my_products = Add_prod.objects.filter(cat__in=filter_category) 
     context = { "products":my_products} 
    else: 
     my_products = Add_prod.objects.all() 
     context = { "products":my_products} 
    return render(request,"welcome-user.html",context) 

模板文件 “{welcome_user '%删除%URL}从引号()'

<form method='get' action="{% url welcome_user %}"> 

UPDATE

加入报价之间views.welcome_user

网址。py

url(r'^welcome_user/$','views.welcome_user', name='welcome_user'), 
+0

我添加按钮类型=“提交”后复选框field.I认为现在它会寻找行动,但我没有找到我的网页找不到页面。 \t http://127.0.0.1:8000/welcome_user/%20method%3D?cat_name=Economics – Bhanukiran

+0

网址看起来不对。 “welcome_user /%20method%3D?cat_name = Economics”它应该是“welcome_user /?cat_name = Economics” – Anoop

+0

向我显示您更新的模板文件 – Anoop

相关问题