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)