Как сохранить несколько файлов и предотвратить многократный ввод в базу данных

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

Вот пример того, что я говорю This is when i try to upload to database и This is the entry i database

models.py

COLLECTION=(
    ("FICTION", "Fiction"),
    ("NON-FICTION", "Non-Fiction"),
    ("AUTOBIOGRAPHY", "Autobiography"),
    ("BIOGRAPHY", "Biography"),
)

def validate_book_extension(value):
        import os
        from django.core.exceptions import ValidationError
        ext = os.path.splitext(value.name)[1]  # [0] returns path+filename
        valid_extensions = [".pdf", ".epub"]
        if not ext.lower() in valid_extensions:
            raise ValidationError("Unsupported file extension.")

class Books(models.Model):
    """
    This is for models.py
    """
    book_title = models.CharField(max_length=255, default="", primary_key=True)
    collection = models.CharField(max_length=255, choices=COLLECTION, default="")
    # book_author = models.CharField(max_length=255, default="")
    # publication_year = models.CharField(max_length=4, default="")
    # isbn = models.CharField(default="", max_length=25)
    book = models.FileField(default="", upload_to="media/books", validators=[validate_book_extension], verbose_name="book Name")

    class Meta:
        verbose_name_plural = "Books"

    def __str__(self):
        return self.book_title

forms.py

class Book(forms.ModelForm):
    class Meta:
        model = Books
        exclude = ["book_title"]
        widgets = {
            "book_title":forms.TextInput(attrs={"placeholder":"How"}),
            "book":forms.ClearableFileInput(attrs={"multiple":True})
        }

views.py

def books(request):
    form = Book()
    if request.method == "POST":
        form = Book(request.POST, request.FILES)
        files = request.FILES.getlist("book")
        if form.is_valid():
            for f in files:
                names = str(f)
                name = names.strip(".pdf")
                file = Books(book=f, book_title=name)
                file.save()
            form.save()
            return redirect(index)
    else:
        form = Book()
    return render(request, "books.html", {"form":form})

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

Для сохранения нескольких файлов и предотвращения множественных записей в базе данных, вы можете использовать поле FileField или ImageField в Django и указать параметр upload_to, чтобы указать, куда должны быть загружены файлы, и установить параметр unique=True, чтобы предотвратить множественные записи в базе данных.

Вот пример:

from django.db import models

class MyModel(models.Model):
    my_file = models.FileField(upload_to='uploads/', unique=True)

В данном примере модель MyModel имеет поле FileField под названием my_file, которое будет использоваться для хранения файла, загруженного пользователем. Опция upload_to имеет значение 'uploads/', что указывает на то, что загруженный файл должен быть сохранен в каталоге uploads проекта. Опция unique имеет значение True, что гарантирует, что с каждым объектом MyModel в базе данных будет связан только один файл.

Для работы с несколькими файлами можно использовать поле ForeignKey для связи модели MyModel с другой моделью, имеющей поле FileField или ImageField. Вот пример:

from django.db import models

class MyFile(models.Model):
    file = models.FileField(upload_to='uploads/', unique=True)

class MyModel(models.Model):
    files = models.ForeignKey(MyFile, on_delete=models.CASCADE, related_name='models')

В этом примере модель MyFile имеет поле FileField под названием file, которое будет использоваться для хранения файла, загруженного пользователем. Модель MyModel имеет поле ForeignKey под названием files, которое связывает ее с моделью MyFile. Это означает, что каждый объект MyModel может быть связан с несколькими объектами MyFile, что позволяет хранить несколько файлов для каждого объекта MyModel. Опции upload_to и unique используются так же, как и раньше, для указания места загрузки файлов и предотвращения множественных записей в базе данных.

Для доступа к файлам, связанным с объектом MyModel, вы можете использовать атрибут files, который вернет QuerySet объектов MyFile, связанных с объектом MyModel. Например:

my_model = MyModel.objects.first()
my_model_files = my_model.files.all()

Это вернет QuerySet объектов MyFile, связанных с объектом my_model MyModel. Затем вы можете выполнять итерации по QuerySet и получать доступ к отдельным файлам, используя атрибут file объектов MyFile. Например:


for my_file in my_model_files:
    # Do something with the file...
    print(my_file.file)

Вы также можете использовать поле FileField или ImageField в ModelForm, чтобы позволить пользователям загружать файлы при создании или обновлении объекта MyModel. Вот пример:

from django import forms
from .models import MyModel

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['files']

В этом примере класс MyModelForm является `Model

Вернуться на верх