Lors de l'implémentation de la fonction de recherche, nous avons réduit l'utilisation des objets Q. Ici, l'erreur «Le champ associé a obtenu une recherche non valide» est apparue, alors enregistrez la cause.
Le modèle prépare un modèle de publication et contient l'affiche, le titre, le contenu et la date de publication comme champs.
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
<!--Formulaire de recherche-->
<div>
<form action="" method="get">
<a type="submit"></a>
<input name="query" value="{{ request.GET.query }}" type="search" placeholder="Search...">
</form>
</div>
<!--Formulaire de recherche-->
Obtenez le contenu du formulaire de recherche avec q_word = self.request.GET.get ('query')
, et s'il existe, utilisez l'objet Q pour affiner la liste d'objets à rendre dans index.html. S'il n'existe pas, il renvoie simplement object_list.
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
La cause de l'erreur est la partie Q (author__icontains = q_word)
de app / views.py. Dans la classe IndexView de views.py, l'auteur, le titre et le contenu sont spécifiés comme cibles de recherche, mais dans le modèle Post de models.py, le champ auteur est associé au modèle utilisateur par ForeignKey (). Par conséquent, il est nécessaire de spécifier le champ modèle associé au champ auteur. En d'autres termes
Il est nécessaire de le changer en Q (author__username__icontains = q_word)
au lieu de Q (author__icontains = q_word)
et de rechercher le champ username du modèle User associé au champ author.
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) | #Changement! !!
Q(title__icontains=q_word) |
Q(content__icontains=q_word)
)
else:
object_list = Post.objects.all()
return object_list
Recommended Posts