web-dev-qa-db-ja.com

フォームにモデルオブジェクトデータを入力するにはどうすればよいですか?

モデルインスタンスのデータをフォームに入力したい。しかし、私のフォームはモデルよりフィールドが少ないです。このようなコードがある場合:

class Item(models.Model)
    name = models.CharField(max_length=100)
    price = models.PositiveIntegerField()

class ItemForm(forms.Form):
    name = forms.CharField()

この関数の何が問題になっていますか?

def bound_form(request, id):
    item = Item.objects.get(id=id)
    form = ItemForm(item.name)
    return render_to_response('bounded_form.html', {'form': form})

次のようなエラーが発生します:AttributeError: 'ItemForm' object has no attribute 'get'

34
krzyhub
def bound_form(request, id): 
    item = Item.objects.get(id=id) 
    form = ItemForm(initial={'name': item.name}) 
    return render_to_response('bounded_form.html', {'form': form}) 
42
Cadilac

通常、モデルのフォームを作成するときは、 ModelForm を使用します。フォームクラスのフィールドタイプを再定義する必要がないように、DRYの原則に従います。また、検証を自動的に処理します。使用するフィールドとウィジェットをカスタマイズするための完全な柔軟性を保持します。fieldsを使用してください必要なフィールドを指定するか、excludeで無視するフィールドを指定します。

_from Django import forms
from Django.shortcuts import get_object_or_404

class ItemForm(forms.ModelForm):
    class Meta:
        model = Item
        fields = ("name", )

def bound_form(request, id):
    item = get_object_or_404(Item, id=id)
    form = ItemForm(instance=item)
    return render_to_response('bounded_form.html', {'form': form})
_

get_object_or_404()は、ここではエラー処理の形式として役立ちます。欠落しているIDに対してItem.objects.get(id=id)を使用すると、キャッチされない_Item.DoesNotExist_例外がスローされます。もちろん、try/exceptブロックを使用することもできます。

57
JCotton