2017-09-30 25 views
0

私はDjangoで約3ヶ月間作業していますが、クラスベースのビューに移行するために少し上手くなっていると感じています。彼らは表面が清潔で分かりやすく、場合によっては理解しやすいように見えます。他の人にはそうではありません。私はModelChoiceFieldとフォームを介して単純なドロップダウンビューを使用しようとしています。私は私のviews.pyファイルに以下に示すように、関数ベースのビューで動作するように取得することができます。ModelChoiceFieldを使用したDjangoクラスベースのビュー

def book_by_name(request): 
    form = BookByName(request.POST or None) 
    if request.method == 'POST': 
     if form.is_valid(): 
      book_byname = form.cleaned_data['dropdown'] 
      return HttpResponseRedirect(book_byname.get_absolute_url1()) 
    return render(request,'library/book_list.html',{'form':form}) 

ここforms.pyで私のフォームです:

class BookByName(forms.Form): 

    dropdown = forms.ModelChoiceField(queryset=Book.objects.none()) 

    def __init__(self, *args, **kwargs): 
     super(BookByName, self).__init__(*args, **kwargs) 
     self.fields['dropdown'].widget.attrs['class'] = 'choices1' 
     self.fields['dropdown'].empty_label = '' 
     self.fields['dropdown'].queryset = Book.objects.order_by('publisher') 

このコードは動作します。クラスベースのビューに変換しようとすると、それはトラブルが始まるときです。同じフォームでこれを使用している場合、私は属性のエラーが表示さ

class BookByNameView(FormView, View): 
    form_class = BookByName 
    initial = { 'Book' : Book } 
    template_name = 'library/book_list.html' 

    def get(self, request, *args, **kwargs): 
     form = self.form_class(initial=self.initial) 
     return render(request, self.template_name, {'form': form}) 

    def get_success_url(self, *args): 
     return reverse_lazy('library:book_detail', args = (self.object.id,)) 

は「BookByNameView」オブジェクトが属性「オブジェクト」がありません:私はviews.pyにこのような何かをしようとしました。

ListViewも試してみたところ、いくつかのエラーが表示されていました。 get_success_urlもプライマリキーを取得する必要があり、そのキーを取得する方法もわかりません。繰り返しますが、私は3ヶ月間のDjango初心者ですので、控えめで、あなたの考えや提案に感謝してください!私は野球場にいるように感じる...ただ座席を見つけることができない!これを行うクリーナー/より良い方法があれば、私はこれを違うやり方にするのはとても大変です!

最新のフィードバックに基づいて、それはクラスベースビューのようになります表示されます:

class BookNameView(FormView): 
    form_class = BookName 
    template_name = 'library/book_list.html' 

    def get_success_url(self, *args): 
     return reverse_lazy('library:book_detail') 

この正しいですか?私はこれのテスト版を走らせ、あなたがなぜself.object.idを使っているのかというあなたの質問に答えて、私はモデルチェイスフィールドからpkを取得しようとしています。私が取得しようとしているビューを返すために使用しています。これは私が少し失われているところかもしれません。私はmodelchoicefieldドロップダウンから詳細ビューを取得しようとしていて、選択された本を返します。しかし、私はこのビューにpkを正常に渡すことはできません。

私は自分のコードに...

class BookByNameView(FormView, ListView): 
    model = Book 
    form_class = BookByName 
    template_name = 'library/book_list.html' 

    def get_success_url(self, *args): 
     return reverse_lazy('library:book_detail') 

更新しかし、今では見られない引数なし​​の「book_detail」のリバース...エラーを言います。

答えて

0

FormViewでform_valid()関数をオーバーライドして、必要な機能を実現できます。フォームが有効な場合は、form_valid()関数に渡されます。

これを試してみてください:私の質問に答えるために時間を割いて

class BookByNameView(FormView): 
     model = Book 
     form_class = BookByName 
     template_name = 'library/book_list.html' 

     def form_valid(self, form): 
      bookbyname = form.cleaned_data['dropdown'] 
      return HttpResponseRedirect(bookbyname.get_absolute_url()) 
1

self.objectを使用している理由は何ですか?元のビューでform.cleaned_dataを使用しました。これは、クラスベースのバージョンでも使用する必要があります。フォームはform_validに渡されることに注意してください。

他にも奇妙なことがたくさんあることにご注意ください。あなたのgetメソッドは無意味です。あなたの定義はinitialです。両方を削除する必要があります。また、FormViewは既にViewから継承しているため、宣言内にViewを明示的に持つ必要はありません。

+0

感謝を。私が書いたように、私はこれで新しいので、フォーラムで私の質問。あなたは文法を詳しく教えていただけますか? –

+0

あなたのコメントに基づいてコードを更新しました。これはあなたが提案しているものに近いですか? –

+0

もう少し再生した後、リストビューを使用するようにビューを更新しました。これは、私が望むことをして、モデルの選択欄に書籍のリストを読み込みます。それはうまく動作します。しかし、私のモデルの選択肢の項目の1つを選択しようとすると、個々のレコードを表示することができないようです。私はほとんどそこにいる... –

関連する問題