次のようなフォームがあります。
class AddressSearchForm(forms.Form):
"""
A form that allows a user to enter an address to be geocoded
"""
address = forms.CharField()
この値は保存していませんが、住所をジオコーディングして有効であることを確認しています。
def clean_address(self):
address = self.cleaned_data["address"]
return geocode_address(address, True)
ジオコード関数は次のようになります。
def geocode_address(address, return_text = False):
""" returns GeoDjango Point object for given address
if return_text is true, it'll return a dictionary: {text, coord}
otherwise it returns {coord}
"""
g = geocoders.Google()
try:
#TODO: not really replace, geocode should use unicode strings
address = address.encode('ascii', 'replace')
text, (lat,lon) = g.geocode(address)
point = Point(lon,lat)
except (GQueryError):
raise forms.ValidationError('Please enter a valid address')
except (GeocoderResultError, GBadKeyError, GTooManyQueriesError):
raise forms.ValidationError('There was an error geocoding your address. Please try again')
except:
raise forms.ValidationError('An unknown error occured. Please try again')
if return_text:
address = {'text':text, 'coord':point}
else:
address = {'coord':point}
return address
ここで行う必要があるのは、住所データを使用してモデルをクエリし、結果をフィルター処理するビューを作成することです。これを行う方法がわからなくて困っています。できればCBVを使いたいです。FormView を使用してフォームを表示し、ListView を使用してクエリ結果を表示できますが、2 つの間でフォーム データを渡すにはどうすればよいでしょうか。
前もって感謝します。
更新: モデルにクエリを実行して結果をフィルタリングする方法を知っています。フィルターのcleaned_dataにアクセスできるように、フォームとクラスベースのビューを使用して適切に組み合わせる方法がわかりません。例えば:
プロセスは次のとおりです。
1) 取得時にフォームを表示する 2) フォームを送信し、投稿時に (ジオコード アドレス) を検証する 3) クエリを実行して結果を表示する
address = form.cleaned_data['address']
point = address['coord']
qs = model.objects.filter(point__distance_lte=(point, distance)