我正在尝试使搜索栏工作。每当我在views.py
中键入内容时,都应该显示它,而其他人则不应该出现。我已经编写了将要显示的代码,但是当我运行代码时,它给了我属性错误type object 'Destination' has no attribute 'filter'
。如何解决这个问题?
index.html
<form class="love" method="GET" action="">
<input type="text" placeholder='Search..' name="srh" value="{{request.GET.srh}}"> <br>
<button type="submit" class="btn btn-danger"> Search </button>
</form>
views.py
from django.shortcuts import render
from . models import Destination
from django.db.models import Q
def index(request):
query = request.GET.get('srh')
if query:
match = Destination.filter(Q(desc_icontains=query))
# instead of writing this
target1 = a, b= [Destination() for __ in range(2)]
a.img = 'Article.jpg'
b.img = 'Micro Tasks.jpeg'
a.desc = 'Article Writing'
b.desc = 'Micro Tasks'
# I am trying to make a loop but it is not working.
target1 = Destination.objects.all()
for field in target1:
[Destination(img = f'{field.img}', title = f'{field.title}') for __ in range(2)]
应用网址
from . import views
urlpatterns = [path('', views.index, name='index')]
主网址
from django.contrib import admin
from django.urls import path, include
from firstapp.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('firstapp.urls'))]
已安装的应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
答案 0 :(得分:0)
您的Destination
类不是模型。为了建立模型,您应该使该类成为Model
class [Django-doc]的子类。此外,您要存储在数据库中的字段应该是Field
class的实例。因此,您应该将模型重写为:
class Destination(models.Model):
desc = models.CharField(max_length=255)
img = models.CharField(max_length=255)
price = models.IntegerField()
无需添加id
字段。如果您自己未指定主键,则Django将创建一个名为AutoField
的字段id
。您可能想将img
设为ImageField
[Django-doc],但这是另一个讨论。
一旦构建了该模型,就可以运行manage.py makemigrations
[Django-doc]来制作迁移文件;和manage.py migrate
[Django-doc]迁移数据库,从而创建相应的表。
为了访问模型的记录,您需要访问Manager
,就像.objects
Django会自动附加到模型上一样。只有Manager
和QuerySet
可以.filter(..)
,.exclude(..)
等。
您将遇到的另一个问题是,您需要两个连续的下划线才能使用字段查找,因此__icontains
而不是_icontains
。
这里最后使用.distinct()
是没有用的,因为desc
是Destination
模型上的模型字段,因此过滤将不会与现有表联接。
您可以这样实现:
match = Destination.objects.filter(desc__icontains=query)