Как сохранить несколько файлов и предотвратить многократный ввод в базу данных
Я пытаюсь сохранить несколько файлов в базу данных. Однако проблема заключается в том, что при каждой загрузке создаются две записи.
Вот пример того, что я говорю и
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