我有一个不同城市的活动模型。当你在网站上选择一个你所在的城市时。我想要做的就是你只看到你所在城市的可用事件。我的问题是在渲染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>
答案 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']