Как заполнить форму данными объекта модели? - PullRequest
27 голосов
/ 19 августа 2011

Я хочу заполнить форму данными из экземпляра модели.Но моя форма имеет меньше полей, чем модель.Если у меня есть код, подобный этому:

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'

Ответы [ 2 ]

50 голосов
/ 21 сентября 2011

Обычно при создании формы для модели вы можете использовать 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() полезен здесь как форма обработки ошибок. Использование Item.objects.get(id=id) для отсутствующего идентификатора в противном случае вызовет необработанное исключение Item.DoesNotExist. Конечно, вы можете использовать блок «попробуй / кроме».

37 голосов
/ 21 сентября 2011
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}) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...