Django模型:使用自定义字段保存对象

时间:2018-10-09 08:23:18

标签: django django-models

我想知道我该怎么做:通过带有自定义字段的Django模型将对象保存到数据库中。

这是我的模型类:

class Document(EdqmTable):

    language = models.CharField(max_length=2, verbose_name=_('language'), choices=LANGUAGE_CHOICES, null=False)
    format = models.CharField(max_length=10, verbose_name=_('format'), choices=FORMAT_CHOICES, null=False)
    title = models.CharField(max_length=512, verbose_name=_('document title'), null=False)
    publication = models.ForeignKey(Publication, verbose_name=_('publication title'), null=False,
                                    related_name='documents')

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

    def save(self, *args, **kwargs):
        self.title = f"{self.publication.pub_id}-{self.format.upper()}"
        super(Document, self).save(*args, **kwargs)

我有一个save方法,该方法可以结合两个字段来定义我的字段titletitle字段隐藏在我的django表单中,由Django自动设置。

但是,到目前为止,由于我的对象未保存到我的数据库中,因此该方法不起作用。我的save函数有问题吗?

编辑:

我使用forms.py文件和视图编辑了帖子:

在我的django表单中,字段document.title用于这样的表单集:

class PublicationForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['category'].empty_label = _('Select a category')  # Modify initial empty_label

    class Meta:
        model = Publication
        fields = ['title', 'pub_id', 'category']


class DocumentForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(DocumentForm, self).__init__(*args, **kwargs)
        self.fields['title'].widget = forms.HiddenInput()

        for key in self.fields:
            self.fields[key].required = True

    class Meta:
        model = Document
        fields = ['publication', 'language', 'format', 'title', 'upload']


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

根据这部分我的看法:

class PublicationCreateView(EdqmCreateView):
    """ Create publication with document form through formset """
    model = Publication
    template_name = 'freepub/publication_form.html'

    def get_context_data(self, **kwargs):
        context = super(PublicationCreateView, self).get_context_data(**kwargs)

        context['document_form'] = DocumentFormSet(self.request.POST or None, self.request.FILES or None)

        return context

    def form_valid(self, form):
        context = self.get_context_data()
        document = context['document_form']
        if document.is_valid():
            self.object = form.save()
            document.instance = self.object
            document.save()
        return super(PublicationCreateView, self).form_valid(form)

    def get_success_url(self):
        return reverse('publication-list-crud')

0 个答案:

没有答案