django的新手。
索引页的结构视图。如文档中所述,使用“使用Q
对象进行复杂查找”。
遇到以下错误
请求方法:GET请求URL: http://127.0.0.1:8000/music/?q=wretched Django版本:1.11.12 异常类型:FieldError异常值:
无法将关键字“专辑标题_图标”解析为字段。选择项 是:专辑收藏,专辑徽标,专辑标题,艺术家,流派,ID,歌曲, 用户,user_id
异常位置: /usr/lib64/python2.7/site-packages/django/db/models/sql/query.py在 names_to_path,第1352行Python可执行文件:/ usr / bin / python Python 版本:2.7.15
引起问题的函数视图为index()
(如下所示)
def index(request):
if not request.user.is_authenticated():
return render(request, 'music/login_form.html')
else:
albums= Album.objects.filter(user=request.user)
songs=Song.objects.filter(album=albums)
num= Album.objects.filter(user=request.user).count()
req= request.GET.get("q")
if req:
albums= albums.filter(
Q(album_title_icontains=req) |
Q(artist_icontains=req)
).distinct()
songs=songs.filter(
Q(song_title_icontains=req)
).distinct()
context={
'object_list': albums,
'num': num,
'songs': songs
}
return render(request, 'music/index.html', context)
models.py 文件文件如下所示
from __future__ import unicode_literals
from django.contrib.auth.models import Permission, User
from django.db import models
from django.core.urlresolvers import reverse
class Album(models.Model):
user= models.ForeignKey(User, default=1)
artist= models.CharField(max_length=100)
album_title= models.CharField(max_length=200)
genre= models.CharField(max_length=50)
album_logo= models.FileField()
album_favorite= models.BooleanField(default=False)
def get_absolute_url(self):
return reverse('music:detail',kwargs={'pk':self.pk})
def __str__(self):
return self.album_title+' by '+ self.artist
class Song(models.Model):
album= models.ForeignKey(Album, on_delete=models.CASCADE)
song_title= models.CharField(max_length=200)
audio_file= models.FileField(default='')
is_favorite= models.BooleanField(default=False)
def __str__(self):
return self.song_title
def get_absolute_url(self):
alb= self.album
return reverse('music:detail',kwargs={'pk':alb.pk})
我们将不胜感激。预先感谢。
答案 0 :(得分:2)
您需要使用dundee('__')双下划线才能使用过滤器。
albums= albums.filter(
Q(album_title__icontains=req) |
Q(artist__icontains=req)
).distinct()
songs=songs.filter(
Q(song_title__icontains=req)
).distinct()
答案 1 :(得分:0)
您的观点是正确的,只是一个很小的错字。您只需要双下划线:-
__
为您的查询。 From docs
正确-Views.py
def index(request):
if not request.user.is_authenticated():
return render(request, 'music/login_form.html')
else:
albums= Album.objects.filter(user=request.user)
songs=Song.objects.filter(album=albums)
num= Album.objects.filter(user=request.user).count()
req= request.GET.get("q")
if req:
albums= albums.filter(
Q(album_title__icontains=req) |
Q(artist__icontains=req)
).distinct()
songs=songs.filter(
Q(song_title__icontains=req)
).distinct()
context={
'object_list': albums,
'num': num,
'songs': songs
}
return render(request, 'music/index.html', context)