私は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」のリバース...エラーを言います。
感謝を。私が書いたように、私はこれで新しいので、フォーラムで私の質問。あなたは文法を詳しく教えていただけますか? –
あなたのコメントに基づいてコードを更新しました。これはあなたが提案しているものに近いですか? –
もう少し再生した後、リストビューを使用するようにビューを更新しました。これは、私が望むことをして、モデルの選択欄に書籍のリストを読み込みます。それはうまく動作します。しかし、私のモデルの選択肢の項目の1つを選択しようとすると、個々のレコードを表示することができないようです。私はほとんどそこにいる... –