2017-12-27 20 views
2

私はDjangoを初めて使いました。最近、ユーザーが数字に基づいてレコードを検索できるシステムを作成しました。それは単純な検索です。システム番号には先行ゼロが付いています。システムは、ゼロの有無にかかわらず数字を認識したいと思っています。私はこのシステムを実装することができましたし、私は、ユーザーが次のコードで指定する数値を変換しています:上記ユーザーが入力済みであることを確認する

def get_queryset(self): 
    queryset = super(SearchResultsView, self).get_queryset() 
    search_query = int(self.request.GET.get("q")) 
    if search_query: 
     queryset = Book.objects.filter(Q(request_number__icontains=search_query)).distinct() 

コードは限りユーザーが番号を入力すると、正常に動作します。彼らがtypoと文字を含む場合、私はBase10の無効なリテラルを取得します。私はエラーを理解している、手紙はINTではありません。私は午後のほとんどをこのエラーを防ぐ方法を探して過ごしました。私が探しているものを見つけることができません。

if search_query: 
     try: 
      queryset = Book.objects.filter(Q(request_number__icontains=search_query)).distinct() 
     except ValueError: 
      q = 0000000 
    return queryset 

しかし、文字は依然として解釈されていますが、その後も、Base10エラーの無効なリテラルが表示されます。数字を基にしたクエリで文字が問題を引き起こさないようにするにはどうすればよいですか?

検索クエリのINTへの変換を削除すると、文字はもはや問題を引き起こさず、システムは何も返さないので、私は回避することができると考えています。システムが両方の処理を行う方法を知りたい場合は、文字を受け入れて無効なリテラルエラーを防ぎ、システムが入力を整数に変換できるようにしてください。お寄せいただきありがとうございます。

ダニエルローズマンが示唆したように、私は次の形式を使用しようとしましたが、どちらか...

クラスRequestNumberSearch(forms.Form)エラーをキャッチしていないよう:

q = forms.IntegerField(required=True) 

def __init__(self, user, *args, **kwargs): 
    super(RequestNumberSearch, self).__init__(*args, **kwargs) 
    self.fields['q'].widget.attrs['class'] = 'name2' 

def clean_q(self): 
    data = self.cleaned_data['q'] 
    if q != int: 
     raise forms.ValidationError("Please enter valid numbers!") 

    return data 
+1

これはまさにフォームのためのものです。 –

+0

@Daniel Roseman..Yes私はこの目的のためにフォームを活用しようとしました...フォームを追加しましたが、まだ動作していないようです.... –

+0

しかし、値が有効であることを検証したい場合は整数、CharFieldではなくIntegerFieldを使用してみませんか? –

答えて

1

チェックする前にクエリをintにキャストしようとしています。

search_query = self.request.GET.get("q") 

if search_query.isdigit(): # check is digit 
    queryset = Book.objects.filter(Q(request_number__icontains=search_query)).distinct() 
    return queryset 
elif ... : # another check 
... 
else: 
    return 'query is erroneous' 
関連する問題