Bei der Implementierung der Suchfunktion haben wir die Verwendung von Q-Objekten eingegrenzt. Hier wurde der Fehler "Zugehöriges Feld wurde ungültig gesucht" angezeigt. Notieren Sie daher die Ursache.
Das Modell bereitet ein Post-Modell vor und hat das Poster, den Titel, den Inhalt und das Post-Datum als Felder.
app/models.py
class Post(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
content = models.TextField()
published_at = models.DateTimeField(auto_now_add=True)
app/urls.py
app_name = 'app'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
]
app/index.html
<!--Suchformular-->
<div>
<form action="" method="get">
<a type="submit"></a>
<input name="query" value="{{ request.GET.query }}" type="search" placeholder="Search...">
</form>
</div>
<!--Suchformular-->
Rufen Sie den Inhalt des Suchformulars mit "q_word = self.request.GET.get (" query ")" ab. Verwenden Sie das Q-Objekt, um die in index.html zu rendernde Objektliste einzugrenzen. Wenn es nicht existiert, gibt es einfach object_list zurück.
app/views
class IndexView(generic.ListView):
model = Post
template_name = 'app/index.html'
def get_queryset(self):
q_word = self.request.GET.get('query')
if q_word:
object_list = Post.objects.filter(
Q(author__icontains=q_word) |
Q(title__icontains=q_word) |
Q(content__icontains=q_word)
)
else:
object_list = Post.objects.all()
return object_list
Die Fehlerursache ist der Teil "Q (author__icontains = q_word)" von app / views.py. In der IndexView-Klasse von views.py werden Autor, Titel und Inhalt als Suchziele angegeben, im Post-Modell von models.py wird das Autorenfeld jedoch von ForeignKey () dem Benutzermodell zugeordnet. Daher muss das dem Autorenfeld zugeordnete Modellfeld angegeben werden. Mit anderen Worten Es ist erforderlich, es in "Q (author__username__icontains = q_word)" anstelle von "Q (author__icontains = q_word)" zu ändern und nach dem Benutzernamenfeld des Benutzermodells zu suchen, das dem Autorenfeld zugeordnet ist.
app/views
class IndexView(generic.ListView):
model = Post
template_name = 'app/index.html'
def get_queryset(self):
q_word = self.request.GET.get('query')
if q_word:
object_list = Post.objects.filter(
Q(author__username__icontains=q_word) | #Veränderung! !!
Q(title__icontains=q_word) |
Q(content__icontains=q_word)
)
else:
object_list = Post.objects.all()
return object_list
Recommended Posts