Django 2 модели 1 из - PullRequest
       1

Django 2 модели 1 из

1 голос
/ 23 марта 2020

Я создаю проект, и у меня будет несколько PDF-файлов на временной шкале, поэтому я создал следующие модели:

Как новичок в Django, я не совсем понимаю, как загрузить файл PDF. (который будет загружен пользователем). Когда я отображаю его в формах, он показывает мне поле, похожее на поле, отображаемое для ВЫБОРОВ. Если я попробую для одного файла, он работает отлично, а для 2 - нет.

Вопрос: Как я могу отобразить FileField из pdf-модели?

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
    })

1 Ответ

1 голос
/ 23 марта 2020

Учитывая, что вы можете иметь несколько Pdf с на Timeline, вы должны определить ForeignKey от Pdf до Timeline, поэтому:

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')
    <b>timeline</b> = 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(<i>'some-view'</i>)
    else:
        form = TimelineForm()
        <b>form_pdf = PdfForm()</b>
    return render(request, 'upload_timeline.html', {
        'form': form,
        <b>'form_pdf': form_pdf</b>
    })

Вы должны заменить 'some-view' на имя представления, на которое вы перенаправляете, в случае успешной отправки для реализации Post / Redirect / Получить pattern [wiki] .

В вашем шаблоне вы затем визуализируете обе формы в одном теге <form>:

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

где 'url-of-upload_timeline' следует заменить именем вида функции upload_timeline.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...