Django Formset问题-POST似乎不起作用

时间:2018-09-03 15:18:52

标签: django django-forms formset

我正试图第一次使用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}"

我的表单文件也非常简单,它具有定义的Formset:

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)

我的视图有点复杂:

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很陌生。

0 个答案:

没有答案