使用Javascript和Django模型过滤结果不起作用

时间:2018-01-29 14:03:27

标签: javascript django filtering

我有一个不同城市的活动模型。当你在网站上选择一个你所在的城市时。我想要做的就是你只看到你所在城市的可用事件。我的问题是在渲染html结果时我似乎遇到了问题关于javascript在获取城市和django模型以及结果过滤器之间的视图和交互。

当我尝试使用'GET'在视图中声明城市时,我一直收到关于未声明的全局变量的错误,即我使用以下构造。我已编辑此构造以删除声明,但我仍然得到相同的错误:

def IndexPage(request):


    cityName = request.session['city-name']
    cityId = request.session['city-id']
    venues = ProfileVenue.objects.all().filter()
    oc_list = []

    for venue in venues:
        if Occurrence.objects.filter(date__gte=timezone.now()).filter(event__location=venue).exists() and venue.city.name==cityName:

或者如果我使用这种结构,我会收到异常值'city-name'的'Key error'错误:

if Occurrence.objects.filter(date__gte=timezone.now()).filter(event__location=venue).exists() and venue.city.name==request.session['city-name']:

那么如何才能确保正确过滤?我环顾四周,还没有找到适合我需要的东西。

设置城市价值的Javascript

/* Ciudades */
if(localStorage.getItem("cities") == null){
    $.ajax({
        url: "/api/cities",
        method: "GET",
        dataType: "json",
        async: false
    })
    .done(function(data, status){
        localStorage.setObject("cities", data);
    })
    .fail(function(data, status){
    });
}

$.each(localStorage.getObject("cities"), function(i, c){
    template = '<li><a href="" class="header-city-option" data-id="' + c.id + '" data-name="' + c.name + '">' + c.name + '</a></li>';

    $("#header-city-list").append(template);
});

if(localStorage.getItem("city-id") == null){
    localStorage.setItem("city-name", $("#header-city-list li:first-child a").data("name") );
    localStorage.setItem("city-id", $("#header-city-list li:first-childa a").data("id") );

`var token = $("input[name*='csrfmiddlewaretoken']")[0].val`ue;



        $.ajax({
            type: "POST",
            url: "set-city-session",
            data: {
                cityName: city,
                cityId: id,
                csrfmiddlewaretoken: getCookie('csrftoken')
            },
            success: function(){
                if(isClicked)
                    location.reload();

            }
        });
}

$("#header-city").html(localStorage.getItem("city-name") + ' <span class="caret"></span>');

$.each($(".city-filter-input") , function(i, v){
    $(v).val(localStorage.getItem("city-id"));

    changeHomepageByCity(localStorage.getItem("city-name"), localStorage.getItem("city-id"), false);
});

$(".header-city-option").click(function(ev){
    ev.preventDefault();

    var city = $(this).data("name");
    var id = $(this).data("id");

    localStorage.setItem("city-name", city);
    localStorage.setItem("city-id", id);

    $("#header-city").html(city + ' <span class="caret"></span>');

    $.each( $(".city-filter-input") , function(i, v){
        $(v).val(id);
    });

    setCityInServer(city, id, true);
});

function changeHomepageByCity(city, id, isClicked){
    changeBackground(city);
    changeText(city);
    setCityInServer(city, id, isClicked);
}

function changeBackground(city){
    var urlBackground;

    switch(city){
        case "Manchester":
            urlBackground = "/static/img/fondo_main.jpg";
            break;
        case "Liverpool":
            urlBackground = "/static/img/liverpool_background.jpg";
            break;
    }

    $("#main").css("background-image", "url(" + urlBackground + ")");
}

function changeText(city){
    switch(city){
        case "Manchester":
            $("#main h2").html("Live the languages with Milingual in Manchester");
            $("#main p").html("We organize language conversation groups in the best venues in Manchester");
            break;
        case "Liverpool":
            $("#main h2").html("Live the languages with Milingual in Liverpool");
            $("#main p").html("We organize language conversation groups in the best venues in Liverpool");
            break;

    }
}

function setCityInServer(city, id, isClicked){
    var token = $("input[name*='csrfmiddlewaretoken']")[0].value;

    if(isClicked)
        location.reload();

    $.ajax({
        type: "POST",
        url: "set-city-session",
        data: {
            cityName: city,
            cityId: id,
            csrfmiddlewaretoken: getCookie('csrftoken')
        },
        success: function(){
            if(isClicked)
                location.reload();
        }
    });
}

场地模型

class ProfileVenue(models.Model):
    created = models.DateTimeField(auto_now=False, auto_now_add=True, blank = False, null = False, verbose_name = 'Creation Date')
    user = models.OneToOneField(app_settings.USER_MODEL, blank=True, null=True)
    name = models.CharField(max_length = 250, null=True, blank = True, verbose_name = 'Name', unique = True)
    description = models.CharField(max_length = 5000, null=True, blank = True, verbose_name = 'Description')
    phone_number = models.CharField(max_length = 12, null=True, blank = True, verbose_name = 'Phone Number')
    city = models.ForeignKey(City, verbose_name = 'City')
    address = models.CharField(max_length = 1000, null=True, blank = True, verbose_name = 'Address')
    participants_capacity = models.IntegerField( null=True, blank = True, verbose_name = 'Participants Capacity')
    position = GeopositionField(null=True, blank = True,verbose_name='Position')

完整视图目前正在运行而不过滤城市(显示所有场所)

def IndexPage(request):

    venues = ProfileVenue.objects.all().filter()
    oc_list = []

    for venue in venues:
        if Occurrence.objects.filter(date__gte=timezone.now()).filter(event__location=venue).exists() and venue.city.name:#==cityName:  #request.session['city-name']:
            oc = Occurrence.objects.all().filter(date__gte=timezone.now()).filter(event__location=venue)[:1].get()
            oc_list.append(oc)
        if len(oc_list) == 3: break

    teachers = ProfileTeacher.objects.all().filter(published=True)[:3]
    teachers_list = []

    for teacher in teachers:
        if teacher.city.name: #== cityName: #request.session['city-name']:
            teachers_list.append(teacher)

    languages = Language.objects.all()
    levels = LanguageLevel.objects.all()
    events = EventType.objects.all()

    context = {
        'venues_today': oc_list,
        'teachers': teachers_list,
        'languages': languages,
        'levels': levels,
        'events': events
    }

    return render(request, "index.html", context)

def SetCitySession(request):
    if request.method == "POST":

        request.session['city-name'] = request.POST['cityName']
        request.session['city-id'] = request.POST['cityId']

        return JsonResponse({})
def GetCitySession(request):
    if request.method == "GET":

        cityName = request.session['city-name']
        cityId = request.session['city-id']

        context = {
            "cityName": cityName,
            "cityId": cityId
        }

        return JsonResponse(context)


The html

<div class="row">
    <div class="col-xs-12 col-sm-12 col-md-12 col-lg-8 col-lg-offset-2">
        <div class="row">
            {% for venue in venues_today %}
                {% if venue.event.location.cover_image %}
                    <div class="col-xs-12 col-sm-12 col-md-4 col-lg-4">
                        <div class="venue {% if forloop.counter0 > 0 %}hidden-xs hidden-sm{% endif %}" data-href="{% url 'venue-page' venue.event.location.url %}">
                            <img src="{% if venue.event.location.cover_image %}{{ venue.event.location.cover_image.url }}{% else %}{% static 'img/default-venue.png' %}{% endif %}" class="venue-img">
                            <span class="venue-info">
                                <ul>
                                    <li><b>{{ venue.event.location.name }}</b></li>
                                    <li><i class="fa fa-map-marker"></i> {{ venue.event.location.address }}</li>
                                </ul>
                            </span>
                            <span class="venue-rating"><div class="content-rating" data-rating="{{ venue.event.location.rating }}"></div> <!--118 valoraciones--></span>
                        </div>
                    </div>
                {% endif %}
            {% endfor %}
        </div>
    </div>
</div>

1 个答案:

答案 0 :(得分:0)

供其他人参考,我通过在视图请求的开头声明它来解决关键错误问题。从那时起,它运作良好。

def IndexPage(request):

    if 'city-name' not in request.session:
        cityName='Madrid'
        request.session['city-name'] = request.POST.get('cityName')

    else:
        cityName = request.session['city-name']
    if 'city-id' not in request.session:
        cityId = 1
        request.session['city-id'] = request.POST.get('cityId')
    else:
        cityId = request.session['city-id']