Использование Django CreateView для обработки formset - не проверяет - PullRequest
3 голосов
/ 26 марта 2012

проблема

Я пытаюсь изменить представление класса «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

Но это не имело никакого значения.

Ответы [ 2 ]

9 голосов
/ 27 марта 2012

Решение

pip install django-extra-views

И в view.py :

from extra_views import FormSetView
class ItemFormSetView(ModelFormSetView):
    model = Service
    template_name = 'service_formset.html'

Есть обсуждение о том, какв ядро ​​Django, но дискуссии, похоже, зашли в тупик.https://code.djangoproject.com/ticket/16256

Где я нашел решение

В этом хранилище https://github.com/AndrewIngram/django-extra-views есть представление с именем ModelFormSetView, которое делает именно то, что мне нужно.Это представление на основе классов, которое делает то же самое, что и CreateView, но для наборов форм.

0 голосов
/ 26 марта 2012

Django входит в form_invalid (), и в form.errors написано «это поле обязательно для заполнения» для поля длины и имени.

Это нормально и из-за обязательного поля параметра :

По умолчанию каждый класс поля предполагает, что значение является обязательным, поэтому если вы передать пустое значение - None или пустую строку ("") - затем clean () вызовет исключение ValidationError:

Если вы хотите инвертировать это, вы можете установить required = False :

class Service(models.Model):
    TIME_CHOICES = (
        (15, '15 minutes'),
        (30, '30 minutes'),
        )
    length = models.FloatField(choices=TIME_CHOICES,max_length=6, required=False)
    name = models.CharField(max_length=40, required=False)

Чего мне не хватает, чтобы сделать это правильно?

Вы пытались опубликовать форму с именем и значениями длины?

...