我需要你的帮助,因为我被困在一个不知道如何继续的项目中。
我需要实现一个简单的"泛型"文档管理应用程序将其集成到我的项目中。我可以拥有许多由" 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))
我希望我在解释中已经足够清楚了。如果需要,请随时提出更多详细信息。
答案 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()