проблема
Я пытаюсь изменить представление класса «CreateView» для обработки набора форм вместо формы.
Когда клиент выполняет запрос GET, набор форм отображается клиенту правильно.
Проблема в том, когда клиент отправляет форму с POST.
Когда Django получает POST, он попадает в form_invalid (), и в form.errors написано «это поле обязательно для заполнения» для поля длины и имени.
class Service(models.Model):
TIME_CHOICES = (
(15, '15 minutes'),
(30, '30 minutes'),
)
length = models.FloatField(choices=TIME_CHOICES,max_length=6)
name = models.CharField(max_length=40)
class ServiceForm(ModelForm):
class Meta:
model = Service
ServiceFormSet = modelformset_factory(Service,form=ServiceForm)
class ServiceEditView(CreateView):
template_name = "service_formset.html"
model = Service
form_class = ServiceForm
success_url = 'works/'
def form_valid(self, form):
context = self.get_context_data()
formset = context['formset']
if formset.is_valid():
self.object = form.save()
return HttpResponseRedirect('works/')
else:
return HttpResponseRedirect('doesnt-work/')
def form_invalid(self, form):
print form.errors
return HttpResponseRedirect('doesnt-work/')
def get_context_data(self, **kwargs):
context = super(ServiceEditView, self).get_context_data(**kwargs)
if self.request.POST:
context['formset'] = ServiceFormSet(self.request.POST)
else:
context['formset'] = ServiceFormSet(queryset=Service.objects.filter(user__exact=self.request.user.id))
return context
Мой вопрос
Как я могу использовать createview для обработки набора форм?
Чего мне не хватает, чтобы сделать это правильно?
Учебное пособие, из которого я взял большую часть битов к настоящему времени http://haineault.com/blog/155/
Короче, что я сделал до сих пор
Поскольку переменная form.errors говорит, что каждое поле является обязательным, я думаю, что она ожидает обычную форму, а не набор форм -> Мне не хватает некоторой опции, которая сообщает CreateView, что это набор форм.
Я также попробовал решение, предложенное здесь: http://www.kevinbrolly.com/.
class BaseServiceFormSet(BaseModelFormSet):
def __init__(self, *args, **kwargs):
super(BaseServiceFormSet, self).__init__(*args, **kwargs)
for form in self.forms:
form.empty_permitted = False
Но это не имело никакого значения.