2017-02-18 7 views
1

フォームからユーザーテキストを入力し、入力から質問のみを返すWebサイトを作成しようとしています。私はいくつかの入力が提出されるたびに、最初のユーザー入力と質問の両方をデータベースに保存したいと思います。私は基本的にすべての世話をしていますが、フォームのテキストの提出をテストするたびに、このTypeErrorに固執しています。ここでエラーの詳細は以下のとおりです。ここで(TypeError:Djangoで関数を呼び出すときに期待される文字列またはバイト様オブジェクト)

Traceback: 

File "/Users/joshuablew/Projects/HW/env/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner 
    39.    response = get_response(request) 

File "/Users/joshuablew/Projects/HW/env/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/Users/joshuablew/Projects/HW/env/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/Users/joshuablew/Projects/HW/HWapp/v1/views.py" in user_text_view 
    20.    user_questions = Question_Init(user_input_obj) 

File "/Users/joshuablew/Projects/HW/HWapp/v1/function1.py" in Question_Init 
    23. textList = sent_tokenize(text1) 

File "/Users/joshuablew/Projects/HW/env/lib/python3.6/site-packages/nltk/tokenize/__init__.py" in sent_tokenize 
    94.  return tokenizer.tokenize(text) 

File "/Users/joshuablew/Projects/HW/env/lib/python3.6/site-packages/nltk/tokenize/punkt.py" in tokenize 
    1237.   return list(self.sentences_from_text(text, realign_boundaries)) 

File "/Users/joshuablew/Projects/HW/env/lib/python3.6/site-packages/nltk/tokenize/punkt.py" in sentences_from_text 
    1285.   return [text[s:e] for s, e in self.span_tokenize(text, realign_boundaries)] 

File "/Users/joshuablew/Projects/HW/env/lib/python3.6/site-packages/nltk/tokenize/punkt.py" in span_tokenize 
    1276.   return [(sl.start, sl.stop) for sl in slices] 

File "/Users/joshuablew/Projects/HW/env/lib/python3.6/site-packages/nltk/tokenize/punkt.py" in <listcomp> 
    1276.   return [(sl.start, sl.stop) for sl in slices] 

File "/Users/joshuablew/Projects/HW/env/lib/python3.6/site-packages/nltk/tokenize/punkt.py" in _realign_boundaries 
    1316.   for sl1, sl2 in _pair_iter(slices): 

File "/Users/joshuablew/Projects/HW/env/lib/python3.6/site-packages/nltk/tokenize/punkt.py" in _pair_iter 
    310.  prev = next(it) 

File "/Users/joshuablew/Projects/HW/env/lib/python3.6/site-packages/nltk/tokenize/punkt.py" in _slices_from_text 
    1289.   for match in self._lang_vars.period_context_re().finditer(text): 

Exception Type: TypeError at /input/ 
Exception Value: expected string or bytes-like object 

は、私は、テキスト上で実行している機能である:

import nltk 

from nltk.tokenize import sent_tokenize 

from v1 import views 


def Question_Init(user_input_obj): 

    Beginning_Question_Prompts = ("Who","Whom","What","Where","When","Why","Which", 
    "Whose","How","Was","Were","Did","Do","Does","Is") 
    Ending_Question_Prompts = ("?",":","...") 
    questions = [] 

    text1 = user_input_obj 

    textList = sent_tokenize(text1) 

    for sentence in textList: 
     if sentence.startswith(Beginning_Question_Prompts): 
      questions.append(sentence) 

     if sentence.endswith(Ending_Question_Prompts): 
      questions.append(sentence) 

    return questions 

ここに私の見解は、私は私のデータベースと実行への入力を保存するために使用していますです入力上の私の機能。

def text_input(request): 
    form = forms.UserTextForm() 

    if request.method == 'POST': 
     request: 
     form = forms.UserTextForm(request.POST) 

     if form.is_valid(): 
      user_input = request.POST.get('user_input', '') 
      user_input_obj = models.UserText(user_input = user_input) 
      user_questions = Question_Init(user_input_obj) 
      user_questions.save() 

      print(user_questions) 


    else: 
     form = forms.UserTextForm() 

    return render(request, 'text_input_form.html', {'form': form}) 

そして、私のモデル:

class UserText(models.Model): 
    user_input = models.CharField(max_length=2000) 

私は、このエラーは私が行う必要が私に言っているのか理解していません。ユーザー入力を文字列型またはバイト型のものに変換する必要がありますか?これを行うにはどうしたらいいですか?私は、私のモデルでユニコード()メソッドを使って何かをする必要があるかもしれないことも読んだことがあります。私はこの状況でユニコードを使う方法に慣れていません。ユニコードはここで意味がありますか?助けてくれてありがとう、私はそれを感謝します。

+0

私が理解できないことは、それらのTextInputインスタンスで何をやっているのか、なぜそれらにデータを渡しているのかということです。それをしないで、あなたの問題はおそらく遠ざかります。 –

+0

@DanielRoseman TextInputは、ユーザーデータを受け取るTextInputFormに接続されたモデルです。これは必要ないのですか? – jblew

+0

これは組み込みのフォームウィジェットの名前でもありますが、気にする必要はありません。しかし、あなたのnltkコードでは、あなたは何か非常に奇妙なことをしています。関数に渡された 'user_input_obj'オブジェクトを無視して、TextInputクラス自体を介してフィールドに直接アクセスしてみてください。意味はありません。 –

答えて

0

UserInputオブジェクト全体をnlkt関数に渡しています。これは、エラー状態では文字列が必要なだけであるためです。

text1 = user_input_obj.user_input 

が、私はあなたが最初の場所でそのモデルを作成している理由について困惑している正直に言うと - ちょうど request.POST.get(...)の結果を渡すために簡単になります:あなたは、関連するフィールドを渡すことによって、この問題を解決することができQuestion_Init関数に渡します。

この関数は文のリストを返します。saveを呼び出すと、リストには保存メソッドがないため、これは機能しません。あなたがそこに保存しようとしているものがわからない。

+0

これはエラーの問題を解決しました。私はあなたが "text1"のために持っていたものを加え、意味をなさないモデルインスタンスを完全に取り除きました。それはタイプエラーを取り除きました、そして、あなたが述べたように、 "'リスト'オブジェクトは属性 'save'を持たないことを示しました。わかりやすくするために、私のnltk関数を使って入力から見つかった各質問を、データベース内で元のユーザー入力に接続したいと思っています。私はこれがDjangoの3つの関係のうちの1つで行われなければならないと思う。それらをリストとして保存することはできないため、文字列として個別に区切って保存する必要がありますか? – jblew

+0

はい、UserTextへの外部キーを持つSentenceクラスを持つことができます。 –

+0

甘い、どうもありがとうございました。ほんとうにありがとう。私はあなたの指針なしでしばらくの間立ち往生していただろう – jblew

関連する問題