Django извлекает значение фильтра в файле views.py

Я хотел бы предложить пользователю выпадающее окно со всеми значениями определенного атрибута и получить это значение в views.py, чтобы использовать его в качестве аргумента функции (для фильтрации вывода функции представления).

Пример:

models.py

class User(models.Model):
    name = models.CharField(max_length=30)
    email = models.CharField(max_length=30)
    address = models.CharField(max_length=30)

    def __str__(self):
        return self.name

views.py


def users(request):
    users= User.objects.all()
    context = {'users': users}
    return render(request, 'users.html', context)

users.html

{% block content %}

<div>
    <table style="width:100%" class="table table-hover table-sm table-stripped">
        <thead class="thead-dark">
            <tr>
                <th>Name</th>
                <th>E mail</th>
                <th>Address</th>
            </tr>
        </thead>
        {% for i in users%}
            <tr>
                <td>{{i.name}}</td>
                <td>{{i.email}}</td>
                <td>{{i.address}}</td>
            </tr>
        {% endfor %}
    </table>

</div>

{% endblock content%}

Я хочу отобразить в html выпадающий список со всеми значениями User.name, и при выборе использовать значение selected_user в качестве аргумента в views.users() для фильтрации отображаемой таблицы.

Есть идеи, как действовать дальше?

Если я правильно понял, вы можете сделать форму, подобную этой

<form method="post">
    <label for="users">Choose a user:</label>
    <select name="users" id="users">
        {% for user in users %}
            <option value="{{ user.name }}">{{ user.name }}</option>
        {% endfor %}
    </select>
    <button id="submit" type="submit">Submit</button>

</form>

и затем при отправке получить значение выбранной опции, используя следующее

selected_user = request.POST.get('users')

или что-то в этом роде

В вашем html добавьте select элемент и добавьте users сначала данные, а <table> тело пустое.

<div>
    <select class="form-control" id="user" name="user">
        {% for i in users %}
            <option value="{{i.id}}">{{i.name}}</option>
        {% endfor %}
    </select>
    <table id="userTable" style="width:100%" class="table table-hover table-sm table-stripped">
        <thead class="thead-dark">
            <tr>
                <th>Name</th>
                <th>E mail</th>
                <th>Address</th>
            </tr>
        </thead>
        <tbody></tbody>
    </table>
</div>

И в вашем script вызовите new url, используя jQuery.ajax() с каждым . change() событие элемента <select>, чтобы получить значение пользователя, соответствующее предоставленному значению userid и добавить данные в таблицу. Таким образом, вам не нужно refresh переходить на страницу и получать данные при каждом change событии.

<script>
    $('#user').on('change', function() {
        $.ajax({
            url: "/user/" + $(this).val(),
            method: 'GET',
            contentType : 'application/json',
            success: function (data) {
                var tr = '<tr><td>'+ data.name +'</td><td>'+ data.email +'</td><td>'+ data.address +'</td></tr>';
                $('#userTable tbody').append(tr);
            },
            error : function(x) {
                console.log(x);
            }
        });
    });
</script>

Затем в вашем urls.py добавьте новый url как

path('user/<str:user_id>/', views.user_data, name='user-data')

Добавьте свои views.py

from django.shortcuts import get_object_or_404
from django.http import JsonResponse

def user_data(request, user_id):
    user = get_object_or_404(GuruUsers, id=user_id)
    user_data = {
        'name' : user.name,
        'email' : user.email,
        'address' : user.address
    }
    return JsonResponse(user_data, status=200)
Вернуться на верх