Python 从inlineformset_工厂创建模型及其子级时遇到问题
我有一个文件上传模型,定义如下:Python 从inlineformset_工厂创建模型及其子级时遇到问题,python,django,Python,Django,我有一个文件上传模型,定义如下: 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("Up
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显示一个表单,并且我想允许用户在一个步骤中执行文件上传。从我所读到的和所做的,我有以下几点:
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 %}
现在,我被阻止了,我不知道如何继续。我非常感谢您的帮助:您的方法不太正确。内联表单集是一种模式,用于编辑链接到同一上传文件的多个mtest 我会为UploadedFile和Mtest创建一个模型表单。从MtestModelForm中排除file1和file2字段。使用参数将两个上传的文件表单和MtestModelForm放在同一个html标记中 然后在您的视图中,如果这三个表单都有效,请使用保存MtestModelForm,并在保存到db之前更新file1和file2 这是视图的骨架
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
你在这里的做法不太正确。内联表单集是一种模式,用于编辑链接到同一上传文件的多个mtest 我会为UploadedFile和Mtest创建一个模型表单。从MtestModelForm中排除file1和file2字段。使用参数将两个上传的文件表单和MtestModelForm放在同一个html标记中 然后在您的视图中,如果这三个表单都有效,请使用保存MtestModelForm,并在保存到db之前更新file1和file2 这是视图的骨架
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
在保存到数据库之前更新文件1和文件2是指什么?我需要自己处理关系吗?是的,您显式地设置了file1和file2。我已经用视图的草图更新了我的答案。你能展示一下GET部件的代码吗?我不知道如何设置其中的前缀。它与POST部分相同,但没有任何数据,例如file1\u form=UploadedFileFormprefix=file1更正打字错误的感谢。但是,request.FILES不也应该被传递吗?在保存到数据库之前,更新file1和file2指的是什么?我需要自己处理关系吗?是的,您显式地设置了file1和file2。我已经用视图的草图更新了我的答案。你能展示一下GET部件的代码吗?我不知道如何设置其中的前缀。它与POST部分相同,但没有任何数据,例如file1\u form=UploadedFileFormprefix=file1更正打字错误的感谢。但是,request.FILES不也应该被传递吗?