0

そのため、私の Web サイトでは、アカウントに登録した人を検索できるようにしたいと考えています。このコードの目的は、一致するすべてのユーザー名、first_names、および last_names を並べ替えることです。問題は、私の if ステートメントが、テンプレートでの評価方法を正しく評価していないように見えることです。例えば:

q が username、first_name、および last_name に一致するかどうかを最初に評価したいと思います。

次に、q= username と last_name であり first_name ではないかどうかを評価します。

次に、q= username=first_name で、last_name ではありません。

q=username であり、first_name または last_name ではありません。

q= first_name と last_name であり、username ではありません。

q=last_name で、username または first_name ではありません。

最後に q=first_name であり、username または last_name ではありません。

次の情報を持つユーザーを含む、いくつかのテスト ユーザーを作成しました。

username=testuser1、first_name=Jason、last_name=Smith ユーザー名=newperson、first_name=frank、last_name=testuser2

たとえば、「testuser」を検索すると、結果が表示されます

Username:testuser1 Name: Jason Smith であり、「testuser」、q がユーザー名、first_name、および last_name に含まれていることが示されます。私が作成した別のユーザー「newperson」も検索結果に表示されません。ただし、tesuser2を検索するとnewpersonが表示されますが、姓として設定すると、「testuser2」が名であると表示されます。これが私のコードです:

#views.py

def search_people(request):
    errors1 = []
    if 'q' in request.GET:
        q = request.GET['q']
        ...
        #Code evlauating errors
        ...
    else:
        usernames = RegisterProfile.objects.filter(user__username__icontains=q)
        last_names = RegisterProfile.objects.filter(last_name__icontains=q)
        first_names = RegisterProfile.objects.filter(first_name__icontains=q)
    ...

#search_results.html

{% if usernames or first_names or last_names %}
    <p>The following members matched your search results:</p>
    {% if usernames and first_names and last_names %}
        {% for username in usernames %}
            <li>Username:{{ username.user.username }} First Name: {{ username.user.get_profile.first_name }} {{ username.user.get_profile.last_name }}</li>
            <li>q is in all three</li>
        {% endfor %}
    {% endif %}
    {% if usernames and last_names and not first_names %}
        {% for username in usernames %}
            <li>Username:{{ username.user.username }} First Name: {{ username.user.get_profile.first_name }} {{ username.user.get_profile.last_name }}</li>
            <li>q is in username and last name</li>
        {% endfor %}
    {% endif %} 
    {% if usernames and first_names and not last_names %}
        {% for username in usernames %}
            <li>Username:{{ username.user.username }} First Name: {{ username.user.get_profile.first_name }} {{ username.user.get_profile.last_name }}</li>
            <li>q is in username and first name</li>
        {% endfor %}
    {% endif %}
    {% if usernames and not first_names %}
        {% if not last_names %}
            {% for username in usernames %}
                <li>Username:{{ username.user.username }} First Name: {{ username.user.get_profile.first_name }} {{ username.user.get_profile.last_name }}</li>
                <li>q is only in username</li>
            {% endfor %}
        {% endif %}
    {% endif %}
    {% if last_names and first_names and not usernames %}
        {% for last_name in last_names %}
            <li>Username:{{ last_name.user.username }} First Name: {{ last_name.user.get_profile.first_name }} {{ last_name.user.get_profile.last_name }}</li>
            <li>q is in first and last name</li>
        {% endfor %}
    {% endif %}
    {% if last_names and not first_names %}
        {% if not usernames %}  
            {% for last_name in last_names %}
                <li>Username:{{ last_name.user.username }} First Name: {{ last_name.user.get_profile.first_name }} {{ last_name.user.get_profile.last_name }}</li>
                <li>q is only in last name</li>
            {% endfor %}
        {% endif %}
    {% endif %}
    {% if first_names and not last_names %}
        {% if not usernames %}  
            {% for first_name in first_names %}
                <li>Username:{{ first_name.user.username }} First Name: {{ first_name.user.get_profile.first_name }} {{ first_name.user.get_profile.last_name }}</li>
                <li>q is only in first name</li>
            {% endfor %}
        {% endif %}
    {% endif %} 
{% endif %} 

これが長く、最善の方法ではないことは承知していますが、どんなアドバイスも喜んで受け入れます。前もって感謝します。

4

1 に答える 1

1
matches = RegisterProfile.objects.filter(
     Q(user__username__icontains=q)
    |Q(last_name__icontains=q)
    |Q(first_name__icontains=q)
)

<p>The following members matched your search results:</p>
{% for profile in matches %}
<li>Username: {{ profile.user.username }} Name: {{ profile.first_name }} {{ profile.last_name }}</li>
<li>q is in 
    {% if q in profile.user.username %}username, {% endif %}
    {% if q in profile.first_name %}first name, {% endif %}
    {% if q in profile.last_name %}last name.{%endif%}
</li>
{% endfor %}

これはいくらかクリーンアップされる可能性がありますが、構成要素はそこにあります。たとえば、q がユーザー名に含まれている場合、「q はユーザー名に含まれています」のような行が表示されます。また、RegisterProfile がユーザー プロファイルであると想定したため、profile.user.get_profile ビットを省略しました。そうでない場合は、再度追加する必要があります。

あなたが見逃していた重要な部分は、Q オブジェクトのものだと思います。これらを使用すると、フィルターで「AND」よりも複雑なことを行うことができます。

于 2012-09-20T00:16:04.293 に答える