我有一个文件上传模型,如下所示:
class UploadedFile(models.Model):
fpath = models.FileField(...)
sig = models.CharField(max_length=32) # for md5 of data, computed with post_save
我还有另一个名为MTest的模型:
class MTest(models.Model):
file1 = models.ForeignKey("UploadedFile",related_name="first_file")
file2 = models.ForeignKey("UploadedFile",related_name="second_file")
... # other fields here
我想为MTest
显示一个表单,我希望允许用户在一步中执行文件上传。根据我的阅读here和here,我有这个:
def x_attachment_t(request):
c = {}
MTestFormset = inlineformset_factory(UploadedFile, MTest, fk_name="file1",extra=1)
c.update({"formset":MTestFormset})
return render_to_response("form.html",c,context_instance=RequestContext(request))
问题是,我仍然为文件上传字段预先填充了数据,而我只有第二个文件的选择框。这是模板中的代码:
{% for form in formset.forms %}
<div class="span-21 last">
{% for field in form %}
<font color="red">{{ field.errors }}</font>
<div class="span-4">{{ field.label_tag }}</div>
<div class="span-17">{{ field }}</div>
{% endfor %}
</div>
{% endfor %}
现在,我被阻止,我不知道如何继续。我将不胜感激任何帮助:)
答案 0 :(得分:3)
你的方法不太对劲。内联formset是一种“编辑链接到同一MTest
的多个UploadedFile
”的模式。
我会为UploadedFile
和Mtest
创建一个模型表单。从file1
中排除file2
和MtestModelForm
字段。使用prefix
参数将两个上传的文件表单和MtestModelForm
放在同一个html <form>
标记中。
然后在您看来,如果所有三种表单都有效,请使用MtestModelForm
保存commit=False
,并在保存到数据库之前更新file1
和file2
。< / p>
这是视图的骨架
def my_view(request):
if request.method == "POST"
file1_form = UploadedFileForm(request.POST, request.FILES, prefix="file1")
file2_form = UploadedFileForm(request.POST, request.FILES, prefix="file2")
mtest_form = MTestForm(data=request.POST, prefix="mtest")
if mtest_form.is_valid() and file1_form.is_valid and file2_form.is_valid():
file1 = file1_form.save()
file2 = file2_form.save()
mtest = mtest_form.save(commit=False)
mtest.file1 = file1
mtest.file2 = file2
mtest.save()
return HttpResponseRedirect("/success-url/")
# case for invalid form data or GET request omitted