web-dev-qa-db-ja.com

Djangoフォームにデータベースのデータを表示して入力します

Forms.pyに次のようなフォームがあります。

from Django import forms

class ItemList(forms.Form):
     item_list = forms.ChoiceField()

Item_listにデータベースのデータを入力する必要があります。 HTMLで生成された場合、item_listは次のようになります。

<select title="ItemList">
   <option value="1">Select Item 1</option>
   <option value="2">Select Item 2</option>
</select>

クエリの変数は頻繁に変更されて新しい結果が生成されるため、selectステートメントのオプション値はほぼ毎回変更されます。

ItemListにデータベースの値を入力するには、view.pyとテンプレートファイルに何を入れる必要がありますか?

19
avatar

Djangoドキュメントのこの例を見てください:

基本的に、Fieldオブジェクトでquerysetキーワード引数を使用して、データベースから行を取得できます。

class BookForm(forms.Form):
    authors = forms.ModelMultipleChoiceField(queryset=Author.objects.all())

更新

動的なモデル選択フィールドが必要な場合は、フォームのコンストラクターでアイテムIDを渡し、それに応じてクエリセットを調整できます。

class ItemForm(forms.Form):

    # here we use a dummy `queryset`, because ModelChoiceField
    # requires some queryset
    item_field = forms.ModelChoiceField(queryset=Item.objects.none())

    def __init__(self, item_id):
        super(ItemForm, self).__init__()
        self.fields['item_field'].queryset = Item.objects.filter(id=item_id)

P.S.私はこのコードをテストしておらず、正確な設定についてはわかりませんが、主なアイデアが出てくることを願っています。

リソース:

31
miku

あなたがする必要があるのは、あなたが実際にどのオブジェクトを望んでいるかを見つけることです。 「Upvote-if-u-like!」という名前の本を見つけたい場合その後、あなたのurls.pyは好きになるはずです

urlpatterns = [
path('textshare/<str:slug>',views.extract,name="textshare"),]

誰かがmybook.com/textshare/upvote-if-u-like!/を検索するとき

それは彼/彼女をviews.pyに連れて行きます

def extract(request,slug):
    context={}

    obj=bookForm.objects.get(title=slug)
    form=bookModelForm(instance=obj)

    context={'form':form}
    return render(request,'bookfound.html',context)

ここで、bookFormはModels.pyにあり、bookModelFormはforms.pyにあります。HappyDjangoing:)

0
Sourabh Sinha