モデルインスタンスのデータをフォームに入力したい。しかし、私のフォームはモデルよりフィールドが少ないです。このようなコードがある場合:
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'
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})
通常、モデルのフォームを作成するときは、 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ブロックを使用することもできます。