传递滤波器参数时,M2m关系会中断

时间:2014-08-18 16:12:41

标签: python django django-views

我的模型中的属性和图像之间有m2m关系,如imageproperty = models.ManyToManyField(Property,blank = True)。我有一个问题试图过滤属性与他们相关的图像,因为每当我在我的查询中传递一个参数我得到这样的东西,图像没有显示安静好a busy cat http://i60.tinypic.com/vo4bxx.jpg。到目前为止,这是我的代码

def filter_properties(request, prop, p):

    order = "creation_date"
    if p["sort"]: order = p["sort"]
    if p["asc_desc"] == "desc": order = '-' + order

    results = Property.objects.filter(status = True)
    for prop in results:
        prop.images = prop.image_set.all()[:1] #Should i need to return in results so it brings values when filtering?

    if p["name"]       : results = results.filter(name__icontains=p["name"])
    if p["price_from"]  : results = results.filter(price__gte=int(p["price_from"]))
    if p["price_to"]    : results = results.filter(price__lte=int(p["price_to"]))


    if p["category"]:
        lst = p["category"]
        or_query = Q(categories = lst[0])
        for c in lst[1:]:
            or_query = or_query | Q(categories = c)
        results = results.filter(or_query).distinct()

    return results

def search_properties_view(request):

    try: 
        page = int(request.GET.get("page", '1'))
    except ValueError:
        page = 1

    p = request.POST
    prop = defaultdict(dict)

    parameters = dict.fromkeys(
        ('name', 'price_from', 'price_to', 'currency_type', 'activity_type', 'sort', 'asc_desc'),
        '',
    )
    parameters["category"] = []

    for k, v in p.items():
        if k == "category":
            parameters[k] = [int(x) for x in p.getlist(k)]
        elif k in parameters:
            parameters[k] = v
        elif k.startswith("name") or k.startswith("curency_type") or k.startswith("activity_type"):
            k, pk = k.split('-')
            prop[pk][k] = v
        elif k.startswith("category"):
            pk = k.split('-')[1]
            prop[pk]["category"] = p.getlist(k)

    if page != 1 and "parameters" in request.session:
        parameters = request.session["parameters"]
    else:
        request.session["parameters"] = parameters

    results = filter_properties(request, prop, parameters)

    paginator = Paginator(results, 20)
    try:
        results = paginator.page(page)
    except (InvalidPage, EmptyPage):
        request = paginator.page(paginator.num_pages)

    return render(request, 'propiedades/propiedades.html', {
        'propiedades': request.POST,
        'media_url': settings.MEDIA_URL,
        'results': results,
        'params': parameters,
        'categories': PropertyCategory.objects.all()
    })

0 个答案:

没有答案