如何解决Django属性错误的问题?

时间:2019-07-13 16:10:29

标签: python html django

我正在尝试使搜索栏工作。每当我在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',
]

1 个答案:

答案 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会自动附加到模型上一样。只有ManagerQuerySet可以.filter(..).exclude(..)等。

您将遇到的另一个问题是,您需要两个连续的下划线才能使用字段查找,因此__icontains而不是_icontains

这里最后使用.distinct()是没有用的,因为descDestination模型上的模型字段,因此过滤将不会与现有表联接。

您可以这样实现:

    match = Destination.objects.filter(desc__icontains=query)