Django:使用通用inlineformset动态地过滤,限制和显示文件

时间:2015-08-29 23:03:07

标签: python django django-views django-generic-views inline-formset

我需要你的帮助,因为我被困在一个不知道如何继续的项目中。

我需要实现一个简单的"泛型"文档管理应用程序将其集成到我的项目中。我可以拥有许多由" utilisation_type"定义的文档。 in" DocumentType"模型。

最后,我需要显示一个内联表单的页面,每个页面只有一个" DocumentType" (在这种情况下)" utilisation_type" =" USER"。

像这样,例如,用户将得到一个带有3个按钮的页面,每个按钮只对应一个DocumentType,其中包含" utilisation_type" =" USER"并且他只能上传每个请求文件中的一个。

以下是我的模特:

from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

UTILISATION_TYPE_CHOICES = (
    ("USER", _(u"User")),
    ("PROJECT", _(u"Project")),
    ("TEAM", _(u"Team")),
    ("ALL", _(u"All")),
)

class DocumentType(models.Model):
    document_type = models.CharField(max_length=40, choices=DOCUMENT_TYPE_CHOICES)
    title = models.CharField(_(u'Titre'), max_length=255, blank=False, null=True)
    utilisation_type = models.CharField(max_length=15, choices=UTILISATION_TYPE_CHOICES)    

class Document(models.Model):
    document_type = models.ForeignKey(DocumentType)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    document = models.FileField(_(u"Document"), upload_to='upload/documents', null=True, blank=True)

class MyUserManager(BaseUserManager):
    first_name = models.CharField(_(u'Firstname'), max_length=90, blank=False)
    last_name = models.CharField(_(u'Lastname'), max_length=90, blank=False)

以下是我的观点:

@login_required
def documents(request):
    """
    User's documents edition
    """
    user = request.user
    DocumentInlineFormSet = generic_inlineformset_factory(Document)
    if request.method == 'POST':
        formset = DocumentInlineFormSet(request.POST, request.FILES, instance=user)
        if formset.is_valid():
            formset.save()
            messages.success(request, _(u'Profil updated'), fail_silently=True)
            return redirect('users.views.documents')
    else:
        formset = DocumentInlineFormSet(instance=user)
    return render_to_response('users/user_documents.html', {'formEditDocumentFormset': formset,}, context_instance=RequestContext(request))

我希望我在解释中已经足够清楚了。如果需要,请随时提出更多详细信息。

1 个答案:

答案 0 :(得分:0)

我认为最简单的方法是检查每个文件的保存类型。如果您只允许保存每个doctype一次,您将只为每个用户获得不同的doctypes。在这种情况下,您不需要使用双重过滤等。

您可以通过创建CustomInlineFormSet为表单集中的每个表单重写save()方法。以下是链接:https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#overriding-methods-on-an-inlineformset

例如,它可能像这样:

from django.forms.models import BaseInlineFormSet

class DocumentInlineFormSet(BaseInlineFormSet):
    def clean(self):
        super(DocumentInlineFormSet, self).clean()
        for form in self.forms:
            document = form.save(commit=False)
            #check your document here
            document.save()