views.py
def home(request):
WAllPAPER_PER_PAGE = 15
WALL = Wallpaper.objects.all()
from django.core.paginator import EmptyPage, Paginator
from django.db.models import Q
qd = request.GET.copy()
qd.pop('page', None)
querystring = qd.urlencode()
#link formatting for ordering
ordering =request.GET.get('ordering', "")
#link formatting for sorting
search = request.GET.get('search', "")
if search:
wallpapers = Wallpaper.objects.filter(Q(name__icontains=search) | Q(category__category_name__icontains=search) | Q(tags__tag__icontains=search)).distinct().order_by('-pk')
WALL = None
else:
wallpapers = Wallpaper.objects.all().order_by('-pk')
if ordering:
wallpapers = wallpapers.order_by(ordering)
page = request.GET.get('page', 1)
wallpaper_paginator = Paginator(wallpapers, WAllPAPER_PER_PAGE)
try:
wallpapers = wallpaper_paginator.page(page)
except EmptyPage:
wallpapers = wallpaper_paginator.page(wallpaper_paginator.num_pages)
except:
wallpapers = wallpaper_paginator.page(WAllPAPER_PER_PAGE)
context = {'querystring': querystring, "wallpapers": wallpapers, 'page_obj': wallpapers, 'is_paginated': True, 'paginator': wallpaper_paginator, 'WALL': WALL}
return render(request, "Wallpaper/Home.html", context)
型号.py
class Tags(models.Model):
tag = models.CharField(max_length=100)
def __str__(self):
return self.tag
class Category(models.Model):
category_name = models.CharField(max_length=100)
def __str__(self):
return self.category_name
class Wallpaper(models.Model):
name = models.CharField(max_length=100, null=True)
size = models.CharField(max_length=50, null=True)
pub_date = models.DateField('date published', null=True)
resolution = models.CharField(max_length=100, null=True)
category = models.ManyToManyField(Category)
tags = TaggableManager()
Device_Choices = [
('PC', 'pc'),
('mobile', 'mobile')
]
Devices = models.CharField(max_length=20,choices=Device_Choices, default= 'PC')
image = models.ImageField(upload_to='Wallpaper/Images/', default="")
def __str__(self):
return self.name
错误
文件"C: \用户\Atharvathaware\AppData\Local\Programs\Python39\lib\site packages\django\db\models\sql\query.py";,第1339行,build_filter raise FieldError('相关字段获取了无效的查找:{}'。format(查找[0]((django.core.exceptions.FieldError:相关字段的查找无效:标签
有人能回答吗
在视图home
中使用:
Wallpaper.objects.filter(Q(tags__tag__icontains=search))
意味着对象wallpaper
具有属性tags
,并且tags
属性的值具有属性tag
。此外,tags.tag应该是django.model.Model
的一个实例。
如果我看到class Wallpaper
,我找不到任何与class tags(Model)
相关的字段(o2m,m2m(。我只看到:
class Wallpaper(models.Model):
...
tags = TaggableManager()
我认为这是壁纸的datamanager
,而不是class Tags
的外键。我的观点是,类名的复数形式是一个不好的概念。
尝试添加字段标记。类似的东西:
class Wallpaper(models.Model):
...
tags = models.ManyToManyField(Tags)
tagged = TaggableManager()
也许您没有使用django-taggit的最新版本。我花了一上午的时间处理这个错误,只是为了意识到更新到django-taggit 3.1.0,问题就解决了。