【问题标题】:Django 2 models 1 fromDjango 2 模型 1 来自
【发布时间】:2020-03-23 19:30:12
【问题描述】:

我正在创建一个项目,并且每个时间线将有多个 pdf,因此我创建了以下模型:

作为 Django 的初学者,我对如何上传 pdf 文件(将由用户上传)感到困惑。当我在表单上显示它时,它会显示一个类似于 CHOICES 显示的字段。如果我尝试一个文件,它可以完美地工作,但对于 2 则它没有。

问题是:如何从 pdf 模型中显示 FileField?

class Pdf(models.Model):
    pdf = models.FileField(upload_to='timelinepdfs')


class Timeline(models.Model):
    header = models.CharField(max_length=30, choices=HEADER_CHOICES)
    age = models.CharField(max_length=6, choices=AGE_CHOICES)
    pdfs = models.ForeignKey(Pdf, on_delete=models.CASCADE)

这是我的 forms.py 文件:

class TimelineForm(forms.ModelForm):
    class Meta:
        model = Timeline
        fields = ('header', 'age')

class PdfForm(forms.ModelForm):
    class Meta:
        model = Pdf
        fields = ('pdf',)

这是我的 view.py 类:

def upload_timeline(request):
    form = TimelineForm()
    return render(request, 'upload_timeline.html', {
        'form': form
    })

【问题讨论】:

  • 鉴于每个Timeline 可以有多个Pdfs,你不应该定义一个从Pdf 到Timeline 的ForeignKey 吗?
  • 菜鸟错误!刚刚更正了,谢谢!

标签: python django forms model


【解决方案1】:

鉴于每个Timeline 可以有多个Pdfs,您应该定义一个从Pdf 到Timeline 的ForeignKey,所以:

class Timeline(models.Model):
    header = models.CharField(max_length=30, choices=HEADER_CHOICES)
    age = models.CharField(max_length=6, choices=AGE_CHOICES)

class Pdf(models.Model):
    pdf = models.FileField(upload_to='timelinepdfs')
    timeline = models.ForeignKey(Timeline, on_delete=models.CASCADE)

您只需将两种形式结合起来:

from django.shortcuts import redirect

def upload_timeline(request):
    if request.method == 'POST':
        form = TimelineForm(request.POST, request.FILES)
        form_pdf = PdfForm(request.POST, request.FILES)
        if form.is_valid() and form_pdf.is_valid():
            timeline = form.save()
            form_pdf.instance.timeline = timeline
            form_pdf.save()
            return redirect('some-view')
    else:
        form = TimelineForm()
        form_pdf = PdfForm()
    return render(request, 'upload_timeline.html', {
        'form': form,
        'form_pdf': form_pdf
    })

您应该将 'some-view' 替换为您重定向到的视图的名称,以防提交成功以实现 Post/Redirect/Get pattern [wiki]。

然后,在您的模板中,您可以在同一个 <form> 标签中呈现两个表单:

<form method="POST" action={% url 'url-of-upload_timeline' %}">
    {% csrf_token %}
    {{ form }}
    {{ pdf_form }}
    <input type="submit" value="Submit">
</form>

其中 'url-of-upload_timeline' 应替换为 upload_timeline 函数的视图名称。

【讨论】:

  • 谢谢!!!!!!!!!!!!!我已经坚持了好几个小时了!非常感谢您的帮助!!
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 2010-10-09
相关资源
最近更新 更多