загрузка нескольких файлов Поле файла

#html #django #django-views #django-forms #django-templates

Вопрос:

Я пытаюсь использовать форму, в которой я не хочу загружать несколько файлов одновременно, я не знаю, в чем проблема, кажется, что все работает без ошибок, но когда я проверяю, я нахожу только загруженный файл.
это моя модель:

 class Delivery(models.Model):
    user = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name=_("delivery_user"))
    full_name_reciever = models.CharField(_("Reciever Full Name"), max_length=50)
    pickup_address = models.ForeignKey(Address, on_delete=models.CASCADE, related_name=_("pickup_address"))
    destination_address = models.CharField(max_length=250)
    destination_city = models.ForeignKey(City, on_delete=models.CASCADE, related_name=_("delivery_city"))
    destination_post_code = models.CharField(max_length=20)
    operation_date = models.DateField(
        _("desired pickup date"), auto_now=False, auto_now_add=False, blank=False, null=False
    )
    boxes_number = models.PositiveIntegerField(_("Number of Boxes"), default=1)
    boxes_wight = models.PositiveIntegerField(_("Boxes Wight"), default=1)
    boxes_volume = models.PositiveIntegerField(_("Boxes Volume"), default=0)
    document = models.FileField(
        help_text=_("Delivery Documets"),
        verbose_name=_("Delivery Certificates"),
        upload_to="documents/deliveries_documents/",
    )
    invoice = models.BooleanField(_("check if you want an invoice"), default=False)
    created_at = models.DateTimeField(_("Created at"), auto_now_add=True, editable=False)
    updated_at = models.DateTimeField(_("Updated at"), auto_now=True)
    delivery_key = models.CharField(max_length=200)
    billing_status = models.BooleanField(default=False)
    delivery_status = models.BooleanField(default=False)

    class Meta:
        ordering = ("-created_at",)
        verbose_name = _("Delivery")
        verbose_name_plural = _("Deliveries")

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

view.py:

 class DeliveryCreateView(LoginRequiredMixin, UserPassesTestMixin, CreateView):
    model = Delivery
    form_class = UserDeliveryForm
    template_name = "deliveries/customer/edit_deliveries.html"
    success_url = reverse_lazy("account:dashboard")

    def test_func(self):
        return self.request.user.is_customer and self.request.user.is_active

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        files = request.FILES.getlist("decument")
        if form.is_valid():
            for f in files:
                f.save()
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

    def form_valid(self, form):
        form.instance.user_id = self.request.user.id
        return super().form_valid(form)
 

и форма:

 class UserDeliveryForm(forms.ModelForm):
    class Meta:
        model = Delivery
        fields = [
            "full_name_reciever",
            "pickup_address",
            "destination_address",
            "destination_city",
            "destination_post_code",
            "operation_date",
            "boxes_number",
            "boxes_wight",
            "boxes_volume",
            "document",
            "invoice",
            "delivery_key",
            "billing_status",
            "delivery_status",
        ]
        widgets = {
            "operation_date": forms.DateInput(
                format=("%d-%m-%Y"),
                attrs={"class": "form-control mb-2 delivery-form", "placeholder": "Select a date"},
            ),
            "document": forms.ClearableFileInput(attrs={"multiple": True}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["full_name_reciever"].widget.attrs.update(
            {"class": "form-control mb-2 delivery-form", "Placeholder": "full name reciever "}
        )
        self.fields["pickup_address"].widget.attrs.update(
            {"class": "form-control mb-2 delivery-form", "Placeholder": "pickup address "}
        )
        self.fields["destination_address"].widget.attrs.update(
            {"class": "form-control mb-2 delivery-form", "Placeholder": "destination address"}
        )
        self.fields["destination_city"].widget.attrs.update(
            {"class": "form-control mb-2 delivery-form", "Placeholder": "destination city"}
        )
        self.fields["destination_post_code"].widget.attrs.update(
            {"class": "form-control mb-2 delivery-form", "Placeholder": "Post Code"}
        )
        self.fields["boxes_number"].widget.attrs.update(
            {"class": "form-control mb-2 delivery-form", "Placeholder": "boxes number"}
        )
        self.fields["boxes_wight"].widget.attrs.update(
            {"class": "form-control mb-2 delivery-form", "Placeholder": "boxes wight"}
        )
        self.fields["boxes_volume"].widget.attrs.update(
            {"class": "form-control mb-2 delivery-form", "Placeholder": "boxes volume"}
        )
        self.fields["document"].widget.attrs.update(
            {"multiple": True, "class": "form-control mb-2 delivery-form", "Placeholder": "document"}
        )
        self.fields["invoice"].widget.attrs.update(
            {
                "type": "checkbox",
                "class": "form-check-input delivery-form",
                "Placeholder": "delivery status",
            }
        )
        self.fields["delivery_key"].widget.attrs.update(
            {"class": "form-control mb-2 delivery-form", "Placeholder": "delivery key"}
        )
        self.fields["billing_status"].widget.attrs.update(
            {
                "type": "checkbox",
                "class": "mb-2 form-check-input delivery-form",
                "Placeholder": "delivery status",
            }
        )
        self.fields["delivery_status"].widget.attrs.update(
            {
                "type": "checkbox",
                "class": "mb-2 form-check-input delivery-form",
                "Placeholder": "delivery status",
            }
        )
 

template I’m using and it working and I can select multiple files to be downloaded:

 {% extends "../../account/sub_base.html" %}
{% load l10n %}
{% block title %}Edit Delivery{% endblock %}

{% block sub_content %}
<div class=" col-lg-10 mx-auto">
  <h1 class="h3">Create/Edit Delivery</h1>
  <div>Add a new <b>Delivery</b> </div>
  <hr />
  <form name="delivery_form" class="delivery-form" method="post" enctype="multipart/form-data">
    {% if form.errors %}
    {{form.errors}}
    <div class="alert alert-primary" role="alert">
      Error: Please try again!
    </div>
    {% endif %}
    {% csrf_token %}
    <div class="form-group">
      <label class="small fw-bold">{{ form.full_name_reciever.label}}</label>
      {{ form.full_name_reciever }}
    </div>

    <div class="form-group">
      <label class="small fw-bold">{{ form.pickup_address.label}}</label>
      {{form.pickup_address }} 
    </div> 
      <div class="form-group">
        <label class="small fw-bold">{{ form.destination_address.label}}</label>
        {{ form.destination_address }}</div>

    <div class="form-group">
      <label class="small fw-bold">{{ form.destination_city.label}}</label>
     {{ form.destination_city }}</div>
     
      <div>
        <label class="small fw-bold">{{ form.destination_post_code.label}}</label>
        {{ form.destination_post_code }} 
      </div> 
      <div class="form-group">
        <label class="small fw-bold">{{ form.operation_date.label}}</label>
        {{ form.operation_date }} 
      </div> 
      <div>
        <label class="small fw-bold">{{ form.boxes_number.label}}</label>
        {{ form.boxes_number }}
      </div>
      <div>
        <label class="small fw-bold">{{ form.boxes_wight.label}}</label>
        {{ form.boxes_wight }}
      </div>
      <div>
        <label class="small fw-bold">{{ form.boxes_volume.label}}</label>
        {{ form.boxes_volume }}
      </div>
      <div>
        <label class="small fw-bold">{{ form.document.label}}</label>
        {{ form.document }}
      </div>
      <div class="form-group form-check">
        <label class="small fw-bold">{{ form.invoice.label}}</label>
        {{ form.invoice }} 
      </div>
      <div>
        <label class="small fw-bold">{{ form.delivery_key.label}}</label>
        {{ form.delivery_key }}
    </div>

    <div class="form-group form-check">
      <label class="small fw-bold">{{ form.billing_status.label}}</label>
      {{ form.billing_status }} 
    </div>

    <div class="form-group form-check">
      <label class="small fw-bold">{{ form.delivery_status.label}}</label>
      {{ form.delivery_status }} 
    </div> 
    <button class="btn btn-primary btn-block py-2 mb-4 mt-4 fw-bold w-100" type="button" value="Submit"
        onclick="submitForm()">
      Add Delivery
      </button>
  </form>

</div>

<script>
  function submitForm() {
    var form = document.getElementsByName('delivery_form')[0];
    form.submit(); // Submit the form
    form.reset(); // Reset all form data
    return false; // Prevent page refresh
  }
</script>
{% endblock %}