検索 - Django

uls

pythonApp\crud\crud\member\urls.py

from django.urls import path
from . import views

urlpatterns = [
  path('', views.index, name='index'),
  path('create', views.create, name='create'),
  path('edit/<int:num>', views.edit, name='edit'),
  path('delete/<int:num>', views.delete, name='delete'),
  path('find', views.find, name='find'),
]

templates

pythonApp\crud\crud\member\templates\member\find.html

{% load static %}
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <h1>member/find</h1>

  <table>
    <form action="{% url 'find' %}" method="post">
      {% csrf_token %}
      {{form}}
      <tr>
        <th></th>
        <td><input type="submit" value="click"></td>
      </tr>
    </form>
  </table>
  <table>
    <tr>
      <th>data</th>
      <th></th>
      <th></th>
    </tr>
    {% for item in data %}
    <tr>
      <td>{{item}}</td>
      <td><a href="{% url 'edit' item.id %}">Edit</a></td>
      <td><a href="{% url 'delete' item.id %}">Delete</a></td>
    </tr>
    {% endfor %}
  </table>
</body>
</html>

views

pythonApp\crud\crud\member\views.py

from django.shortcuts import render
from django.http import HttpResponse
from django.shortcuts import redirect
from .models import User
from .forms import UserForm
from .forms import FindForm

# Create your views here.
def index(request):
  data = User.objects.all()
  params = {
    'title': 'Hello',
    'data': data,
  }
  return render(request, 'member/index.html', params)

def create(request):
  if(request.method == 'POST'):
    obj = User()
    user = UserForm(request.POST, instance=obj)
    user.save()
    return redirect(to='/member')
  
  params = {
    'title': 'Hello',
    'form': UserForm(),
  }
  return render(request, 'member/create.html', params)

def edit(request, num):
  obj = User.objects.get(id=num)
  if(request.method == 'POST'):
    user = UserForm(request.POST, instance=obj)
    user.save()
    return redirect(to='/member')
  
  params = {
    'id': num,
    'form': UserForm(instance=obj),
  }

  return render(request, 'member/edit.html', params)

def delete(request, num):
  user = User.objects.get(id=num)
  if(request.method == 'POST'):
    user.delete()
    return redirect(to='/member')
  
  params = {
    'id': num,
    'obj': user,
  }

  return render(request, 'member/delete.html', params)

def find(request):
  if(request.method == 'POST'):
    form = FindForm(request.POST)
    str = request.POST['find']
    data = User.objects.filter(name=str)
  else:
    form = FindForm()
    data = User.objects.all()
  
  params = {
    'form': form,
    'data': data,
  }

  return render(request, 'member/find.html', params)

forms

pythonApp\crud\crud\member\forms.py

from django import forms
from .models import User

class UserForm(forms.ModelForm):
  class Meta:
    model = User
    fields = ['name', 'mail', 'gender', 'age', 'birthday']

class FindForm(forms.Form):
  find = forms.CharField(label='Find', required=False)

検索条件の指定方法

カラム名__contains=値 値を含む検索
カラム名__startswidth=値 値で始まるものを検索
カラム名__endswidth=値 値で終わるものを検索

name カラムを検索する場合は、次のようにします。

name__contains=値

大文字と小文字を区別しない指定方法は次のとおりです。

カラム名__iexact=値 大文字小文字を区別しない検索
カラム名__icontains=値 値を含み大文字小文字を区別しないあいまい検索
カラム名__istartswith=値 値で始まり大文字小文字を区別しないあいまい検索
カラム名__iendswith=値 値で終わり大文字小文字を区別しないあいまい検索

数値の比較を指定する方法は、次のとおりです。

カラム名=値 値と等しい
カラム名__gt=値 値よりも大きい
カラム名__gete=値 値と等しいか大きい
カラム名__lt=値 値よりも小さい
カラム名__lte=値 値と等しいか小さい

複数の条件を指定する方法は次のようにします。

from django.db.models import Q
User.objects.filter(Q(name__contains=str) | Q(mail__contains=str))

リストを使って複数の条件を指定するには次のようにします。

from django.db.models import Q

str = request.POST['find']
list = str.split()
data = User.objects.filter(name__in=list)