以django形式上传多个文件并在视图中运行

uploading multiple files in django form and function in views

我正在尝试以 Django 形式上传多个文件。我遵循了多种方法。我通过模型到视图是成功的,但我想通过模型到表单再到视图。我关注了 这个问题,但我的表格没有提交。我在这里分享我的代码。我希望任何专家都能指出我正在犯的错误。

#models.py

class Question(models.Model):
    description = models.TextField(blank=True, null=True)
    created_by = models.ForeignKey(User, blank=False, on_delete=models.CASCADE)

    def __str__(self):
        return self.description


class QuestionFile(models.Model):
    question = models.ForeignKey(
        Question, on_delete=models.CASCADE, related_name='files', null=True, blank=True)
    file = models.FileField(
        'files', upload_to=path_and_rename, max_length=500, null=True, blank=True)

    def __str__(self):
        return str(self.question)


#forms.py
from django import forms
from .models import *


class QuestionForm(forms.ModelForm):
    class Meta:
        model = Question
        fields = ['description']


class QuestionFileForm(QuestionForm):  # extending Questionform
    file = forms.FileField(
        widget=forms.ClearableFileInput(attrs={'multiple': True}))

    class Meta(QuestionForm.Meta):
        fields = QuestionForm.Meta.fields + ['file', ]

    def clean(self):
        cleaned_data = super().clean()
        description = cleaned_data.get("description")
        file = cleaned_data.get("file")

        if not description and not file:
            self.add_error(
                'description', 'Kindly describe the question details or upload any file')


#views.py
def questionView(request):
    if request.method == 'POST':
        form = QuestionFileForm(request.POST or None, request.FILES or None)
        files = request.FILES.getlist('file')
        if form.is_valid():
            question = form.save(commit=False)
            question.created_by = request.user
            # add everything needed to add here
            question.save()
            if files:  # check if user has uploaded some files
                for file in files:
                    QuestionFile.objects.create(question=question, file=file)

            messages.success(request, 'Question asked successfully.')
            return redirect('url_name')
    else:
        form = QuestionFileForm()
    context = {
        "page_title": "Ask a Math Question",
        "form": form
    }
    return render(request, 'template.html', context)


#template.html
{% extends 'base.html' %}
<!-- title -->
{% block title %}{{ page_title }}{% endblock title %}

<!-- body -->
{% block content %}
<div class="ask_question text-center">
  <!--for message-->
  {% if messages %} {% for message in messages %}
  <div
    {% if message.tags %}
    class="alert alert-{{ message.tags }} text-center"
    {% endif %}
  >
    {{ message }}
  </div>
  {% endfor %} {% endif %}

  <form
    method="POST"
    action="{% url 'fask_question' %}"
    novalidate
    class="needs-validation"
    enctype="multipart/form-data"
  >
    {% csrf_token %}

    <div class="mb-3">
      <input
        type="file"
        class="clearablefileinput form-control-file"
        name="files"
        id="exampleFormControlFile1"
        multiple
      />
    </div>

    <div class="mb-3">
      <textarea
        class="form-control"
        id="exampleFormControlTextarea1"
        rows="8"
        placeholder="Type your question here"
        name="description"
      ></textarea>
    </div>

    <button type="submit" class="btn">Submit</button>
  </form>
</div>
{% endblock %}

我无法理解我在哪里犯了我的表单没有提交的错误。 如果有人可以提供帮助,我将不胜感激。 提前致谢。

尝试将表单从上下文传递到模板

更改模板的这一部分

<form
    method="POST"
    action="{% url 'fask_question' %}"
    novalidate
    class="needs-validation"
    enctype="multipart/form-data"
  >
    {% csrf_token %}

    <div class="mb-3">
      <input
        type="file"
        class="clearablefileinput form-control-file"
        name="files"
        id="exampleFormControlFile1"
        multiple
      />
    </div>

    <div class="mb-3">
      <textarea
        class="form-control"
        id="exampleFormControlTextarea1"
        rows="8"
        placeholder="Type your question here"
        name="description"
      ></textarea>
    </div>

    <button type="submit" class="btn">Submit</button>
  </form>

  <form
    method="POST"
    action="{% url 'fask_question' %}"
    novalidate
    class="needs-validation"
    enctype="multipart/form-data"
  >
    {% csrf_token %}
  {{ form }}

    <button type="submit" class="btn">Submit</button>
  </form>