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>

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

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