◾️ Django forms
- create forms.py
from django import forms
from django_countries.fields import CountryField
from . import models
class SearchForm(forms.Form):
    # https://docs.djangoproject.com/en/3.2/ref/forms/api/
    # https://docs.djangoproject.com/en/3.2/ref/forms/fields/
    # https://pypi.org/project/django-countries/
    city = forms.CharField(initial="Anywhere")
    country = CountryField(default="JP").formfield()
    price = forms.IntegerField(required=False)
    room_type = forms.ModelChoiceField(
        empty_label="Any kind", queryset=models.RoomType.objects.all(), required=False
    )
    price = forms.IntegerField(required=False)
    room_type = forms.ModelChoiceField(queryset=models.RoomType.objects.all())
    guests = forms.IntegerField(required=False)
    bedrooms = forms.IntegerField(required=False)
    beds = forms.IntegerField(required=False)
    baths = forms.IntegerField(required=False)
    instant_book = forms.BooleanField(required=False)
    superhost = forms.BooleanField(required=False)
    amenities = forms.ModelMultipleChoiceField(queryset=models.Amenity.objects.all())
    facilities = forms.ModelMultipleChoiceField(queryset=models.Facility.objects.all())
    house_rules = forms.ModelMultipleChoiceField(
        queryset=models.HouseRule.objects.all()
    )
- views
以前情報維持:forms.SearchForm(request.GET)
init: unbound form : forms.SearchForm() without validation
after: bounded form : forms.SearchForm(request.GET)
def search(request):
    print(request)
    form = forms.SearchForm()
    return render(request, "rooms/search.html", {"form": form})- template
{% extends "base.html" %}
{% block page_title %}
    Room Search | airbnb
{% endblock page_title %}
{% block search-bar %}
{% endblock search-bar %}
{% block content %}
    <h2>Search</h2>
    <h4>Searching by {{city}}</h4>
    <form action="{% url "rooms:search" %}" method="get">   
        {{form.as_p}}     
        <button>Search</button>
    </form>
    <h3>Search Results</h3>
    {% for r in rooms %}
        <ul>
            <li>
                <h5>{{r.name}}</h5>
            </li>
        </ul>
    {% endfor %}
{% endblock %}
◾️ show checkbox for many to many field(amenities/facilities/house rules)
- use widget option(widget=forms.CheckboxSelectMultiple)
amenities = forms.ModelMultipleChoiceField(
        queryset=models.Amenity.objects.all(), widget=forms.CheckboxSelectMultiple
    )
