我想用模型实例中的数据填充表单。但我的形式比模型少。如果我有这样的代码:
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'
答案 0 :(得分:50)
通常在为模型创建表单时,您需要使用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块。
答案 1 :(得分:35)
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})