Проблема Django Formset - POST не работает - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь использовать django formset впервые, чтобы объединить обе формы на одной странице. Моя форма хорошо отображается, но я не преувеличиваю, чтобы сохранить данные в моей базе данных. Когда я нажимаю кнопку подтверждения, ничего не происходит.

Это мой model.py файл:

class Publication(models.Model):
    title = models.CharField(max_length=512, verbose_name=_('title'), null=False)
    category = models.ForeignKey(Category, verbose_name=_('category'), null=False)
    creation_date = models.DateTimeField(auto_now_add=True, verbose_name=_('creation date'), null=False)
    modification_date = models.DateTimeField(auto_now=True, verbose_name=_('modification date'), null=False)

    class Meta:
        verbose_name = _('publication')
        verbose_name_plural = _('publication')

    def __str__(self):
        return f"{self.title}"

class Document(models.Model):

    FORMAT_CHOICES = (
        ('pdf', 'pdf'),
        ('epub', 'epub'),
    )

    format = models.CharField(max_length=10, verbose_name=_('format'), choices=FORMAT_CHOICES, null=False)
    title = models.CharField(max_length=512, verbose_name=_('title'), null=False)
    publication = models.ForeignKey(Publication, verbose_name=_('publication'), null=False)
    upload = models.FileField(upload_to='media/', default="")
    creation_date = models.DateTimeField(auto_now_add=True, verbose_name=_('creation date'), null=False)
    modification_date = models.DateTimeField(auto_now=True, verbose_name=_('modification date'), null=False)

    class Meta:
        verbose_name = _('document')
        verbose_name_plural = _('document')

    def __str__(self):
        return f"{self.age_id} : {self.title}"

Мой файл формы тоже очень прост с определенным набором форм:

class PublicationForm(forms.ModelForm):
    class Meta:
        model = Publication
        fields = ('title', 'category')


class DocumentForm(forms.ModelForm):
    class Meta:
        model = Document
        fields = ['publication', 'format', 'title', 'upload']


DocumentFormSet = inlineformset_factory(Publication, Document, form=DocumentForm, extra=1)

My view немного сложнее:

class PublicationCreateUpdateView(AgePermissionRequiredMixin, UpdateView):
    """ Display a form to create or update a publication
        Only for age admin.

        **Context**

        ``subtitle``
            Title of the page

        **Template:**

        :template:`app/category_form.html`
    """
    model = Publication
    form_class = PublicationForm
    success_url = reverse_lazy('app:app-publication-list')
    template_name = 'app/publication_form.html'
    permission_required = 'publication.change_webapplication'

    def get_object(self, queryset=None):
        try:
            return super(PublicationCreateUpdateView, self).get_object(queryset)
        except AttributeError:
            return None

    def get_title(self):
        if self.object:
            return _('Edit publication: ') + str(self.object)

        return _('Add new publication')

    def get_context_data(self, **kwargs):
        context = super(PublicationCreateUpdateView, self).get_context_data(**kwargs)
        if self.request.POST :
            context['documents'] = DocumentFormSet(self.request.POST)
        else :
            context['documents'] = DocumentFormSet()
        context.update({
            'subtitle': self.get_title(),
        })
        return context

    def form_valid(self, form):
        context=self.get_context_data()
        documents = context['documents']
        with transaction.atomic():
            self.object = form.save()
            if documents.is_valid():
                documents.instance = self.object
                documents.save()
        return super(DocumentCreateUpdateView, self).form_valid(form)

И, наконец, мой шаблон выглядит так:

{% extends "publication/base_backend.html" %}
{% load i18n %}
{% load crispy_forms_tags %}

{% block main %}

  <form method="post" novalidate>
    {% csrf_token %}
    {% crispy form %}
    {{ documents.management_form }}
    {{ documents.non_form_errors }}
    {% crispy documents %}
    <br>
    <input type="submit" class="btn btn-default" value="{% trans 'Save' %}" />
    <a href="{{request.META.HTTP_REFERER}}" class="btn btn-default">{% trans 'Cancel' %}</a>
  </form>

{% endblock main %}

Я не понимаю, где я мог ошибиться, более того, я довольно новичок с Django Class Based View.

...