Django ModelForms с использованием get_or_create
Я использую ModelForms для создания и рендеринга формы, и она работает нормально. Однако я хочу использовать метод get_or_create вместо метода if form.is_valid():
, но я не знаю, как использовать его с ModelForms.
views.py
def books(request):
genres_names = Genre.objects.all()
if request.method == "POST":
form = BookFile(request.POST, request.FILES)
files = request.FILES.getlist("book")
genres_name = request.POST.get("genres")
genres, created = Genre.objects.get_or_create(name=genres_name)
try:
if form.is_valid():
genre = form.save(commit=False)
genre.save()
if files:
for f in files:
names = str(f)
name = names.strip(".pdf")
Books.objects.create(genre=genre, book_title=name, book=f)
return redirect(index)
except IntegrityError:
messages.error(request, "value exist in database")
return redirect(books)
else:
form = BookFile()
return render(request, "books.html", {"form":form, "genres_names":genres_names})
models.py
class Genre(models.Model):
genres = models.CharField(max_length=255, default="")
class Meta:
verbose_name_plural = "Genre"
def __str__(self):
return self.genres
class Books(models.Model):
"""
This is for models.py
"""
book_title = models.CharField(max_length=255, default="", primary_key=True)
book = models.FileField(default="", upload_to="books", validators=[validate_book_extension], verbose_name="books")
genre = models.ForeignKey(Genre, on_delete=models.CASCADE, default="")
class Meta:
verbose_name_plural = "Books"
def __str__(self):
return self.book_title
forms.py
class BookInfo(forms.ModelForm):
class Meta:
model = Genre
fields = ["genres",]
widgets = {
"genres":forms.TextInput(attrs={"list":"genres"})
}
class BookFile(BookInfo):
book = forms.FileField(widget = forms.ClearableFileInput(attrs={"multiple":True}))
class Meta(BookInfo.Meta):
fields = BookInfo.Meta.fields + ["book",]
мой шаблон
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Upload Books</title>
</head>
<body>
<form action="/books/" method="POST" enctype='multipart/form-data'>
{% csrf_token %}
{% if request.user.is_authenticated %}
<p>
{{form.book}}
</p>
<p>
{{form.genres}}
<datalist id="genres">
<select name="" id="">
{% for name in genres_names %}
<option value="{{name.genres}}">{{name.genres}}</option>
{% endfor %}
</select>
</datalist>
</p>
<p>
<input type="submit" value="Create">
</p>
<div>
<a href="/signout/"><input type="button" value="SignOut"></a>
</div>
<p>
{{form.errors}}
</p>
{% for message in messages %}
<p>{{ message }}</p>
{% endfor %}
{% endif %}
</form>
</body>
</html>
В основном я хочу добиться того, чтобы пользователь мог ввести жанр книги, которую он хочет загрузить, и в то же время все, что пользователь вводит, будет сохранено в базе данных, чтобы последующие записи имели ту же возможность.