Подтвердить что ты не робот

Как я могу заполнить форму данными объекта модели?

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

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'

4b9b3361

Ответ 1

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}) 

Ответ 2

Как правило, при создании формы для модели вы хотите использовать 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) по отсутствующему идентификатору в противном случае приведет к исключению uncaught Item.DoesNotExist. Конечно, вы могли бы использовать блок try/except.