Django - 搜索查询结果加载不正确

问题描述 投票:0回答:1

由于某种原因,当登录用户在我的游戏应用程序中进行搜索查询时,在我的搜索结果页面上会显示所有结果而不是查询本身。

我目前拥有的东西需要修复什么?

我正在构建一个游戏应用程序,登录的用户可以根据他们在我们应用程序中的排名来玩不同的游戏......所以当用户搜索时,让我们说出字母

d
所有已解锁的游戏和锁定的游戏应显示字母
d
。我目前正在获取该信息,但搜索查询显示所有不包含字母
d
的结果。

这仅在用户登录时发生。当用户注销时,搜索可以正常工作,对

d
的搜索查询将显示包含角色
d
的每个游戏的结果。

非常感谢任何帮助!

谢谢!

下面是我的代码。

模型.py

class Game_Info(models.Model):
    id = models.IntegerField(primary_key=True, unique=True, blank=True, editable=False)
    game_title = models.CharField(max_length=100, null=True)
    game_rank = models.IntegerField(default=1)
    game_image = models.ImageField(default='default.png', upload_to='game_covers', null=True, blank=True)

class User_Info(models.Model):
    id = models.IntegerField(primary_key=True, blank=True)
    image = models.ImageField(default='/profile_pics/default.png', upload_to='profile_pics', null=True, blank=True)
    user = models.OneToOneField(settings.AUTH_USER_MODEL,blank=True, null=True, on_delete=models.CASCADE)
    rank = models.IntegerField(default=1)    

views.py

def is_valid_queryparam(param):
    return param != '' and param is not None

def search_filter_view(request):
    user_profile_games_filter = Game_Info.objects.all()
    user_profile = User_Info.objects.all()
    title_query = request.POST.get('q')  

    if is_valid_queryparam(title_query):
        user_profile_games_filter = user_profile_games_filter.filter(game_title__icontains=title_query)

    if request.user.is_authenticated:
        user_profile = User_Info.objects.filter(user=request.user)
        user_profile_game_obj = User_Info.objects.get(user=request.user)
        user_profile_rank = int(user_profile_game_obj.rank)


        user_profile_games_filter = Game_Info.objects.annotate(
            user_unlocked_game=Case(
                When(game_rank__lte=user_profile_rank, then=Value(True)),
                default=Value(False),
                output_field=BooleanField()
            )
        )

        context = {
            'user_profile': user_profile,  
            'user_profile_games_filter': user_profile_games_filter,
            'title_query' : title_query
        }

    else:
        context = {
            'user_profile': user_profile,
            'user_profile_games_filter': user_profile_games_filter,
            'title_query' : title_query
       }

    return render(request, "search_results.html", context)

search.html

<h1>Results for &#34;{{ title_query }}&#34;</h1>


            {% for content in user_profile_games_filter %}
                {% if content.user_unlocked_game %}
                        <!-- unlocked games logic -->
                        <a class="game-tile-container" href="{% url 'detail' content.pk %}">
                            <li class="results_info">
                                <img src= "{{ content.game_image.url }}"> 
                                <span class="results_title">{{ content.game_title }}</span>
                            </li>
                        </a>
        
                        {% else %}
                        <!-- locked games logic -->
                        <a class="game-tile-container" href="{% url 'detail' content.pk %}">
                            <li class="results_info">
                                <div class="locked_game">
                                    <img class="lock-img" src={% static 'images/treasure-chest-closed-alt.png' %} />
                                    <img src= "{{ content.game_image.url }}"> 
                                    <button class="level-up">Reach level {{ content.game_rank }} to unlock</button>
                                </div>
                                <span class="results_title">{{ content.game_title }}</span>
            
                            </li>
                        </a>
                {% endif %}
            {% endfor %}
django django-models django-views django-templates
1个回答
0
投票

我认为这可能是由于这里的这一行:

user_profile_games_filter = Game_Info.objects.annotate(
            user_unlocked_game=Case(
                When(game_rank__lte=user_profile_rank, then=Value(True)),
                default=Value(False),
                output_field=BooleanField()
            )
        )

将 user_profile_games_filter 重新分配给 Game_Info 中的对象。尝试将其删除并查看输出是否相同(所有对象都返回)?

© www.soinside.com 2019 - 2024. All rights reserved.