如何用模型对象数据填写表单?

krz*_*hub 30 forms django models

我想用模型实例中的数据填充表单.但我的形式比模型少.如果我有这样的代码:

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

class ItemForm(forms.Form):
    name = forms.CharField()
Run Code Online (Sandbox Code Playgroud)

这个功能有什么问题,它看起来应该是好的?

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

我得到这样的错误: AttributeError: 'ItemForm' object has no attribute 'get'

JCo*_*ton 55

通常,在为模型创建表单时,您将需要使用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})
Run Code Online (Sandbox Code Playgroud)

get_object_or_404()在这里作为错误处理的一种形式很有用.使用Item.objects.get(id=id)缺少的ID将会抛出未捕获的Item.DoesNotExist异常.当然,你也可以使用try/except块.

  • 这应该被标记为正确答案,因为它不依赖于任何特定字段,只使用模型形式 (2认同)

Cad*_*lac 41

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}) 
Run Code Online (Sandbox Code Playgroud)

  • 我讨厌批评,但我不知道如何实施您的答案。这是在forms.py 还是views.py 中?我如何使用它? (2认同)