Как работать с несколькими ModelForm с помощью CreateView (представления на основе классов) в Django

У меня есть три модели GalleryAlbum, GalleryImage и GalleryVideo. Эти модели имеют соответствующие им ModelForm. Я хочу обрабатывать эти формы с помощью одной модели CreateView в views.py.

Модели GalleryImage и GalleryVideo имеют отношения "один ко многим" с моделью GalleryAlbum

models.py

from django.db import models

INSTITUTE_CHOICES = [
    ("SC", "Shrinathji College"),
    ("SS", "Shrinathji School"),
]


class GalleryAlbum(models.Model):
    title = models.CharField(max_length=255)
    date = models.DateField()
    thumbnail = models.ImageField(
        upload_to="gallery", default="gallery-album-default.jpg"
    )
    institute = models.CharField(max_length=5, choices=INSTITUTE_CHOICES)

    def __str__(self):
        return self.title


class GellaryImage(models.Model):
    album = models.ForeignKey(
        GalleryAlbum, on_delete=models.CASCADE, related_name="images"
    )
    image = models.ImageField()


class GellaryVideo(models.Model):
    album = models.ForeignKey(
        GalleryAlbum, on_delete=models.CASCADE, related_name="videos"
    )
    url = models.URLField()

forms.py

from django import forms
from django.forms.fields import DateField
from django.forms.widgets import DateInput

from gallery.models import GalleryAlbum, GellaryImage, GellaryVideo


class GalleryAlbumForm(forms.ModelForm):

    created = DateField(
        input_formats=["%Y-%m-%d"],
        widget=DateInput(attrs={"type": "date"}),
    )

    class Meta:
        model = GalleryAlbum
        fields = "__all__"

    def __init__(self, *args, **kwargs):
        super(GalleryAlbumForm, self).__init__(*args, **kwargs)
        for visible in self.visible_fields():
            visible.field.widget.attrs["class"] = "form-control"


class GalleryImageForm(forms.ModelForm):
    class Meta:
        model = GellaryImage
        fields = "__all__"

    def __init__(self, *args, **kwargs):
        super(GalleryImageForm, self).__init__(*args, **kwargs)
        for visible in self.visible_fields():
            visible.field.widget.attrs["class"] = "form-control"


class GalleryVideoForm(forms.ModelForm):
    class Meta:
        model = GellaryVideo
        fields = "__all__"

    def __init__(self, *args, **kwargs):
        super(GalleryVideoForm, self).__init__(*args, **kwargs)
        for visible in self.visible_fields():
            visible.field.widget.attrs["class"] = "form-control"

views.py

from django.urls import reverse_lazy
from django.views.generic import ListView, CreateView, DeleteView, UpdateView
from django.contrib.auth.mixins import LoginRequiredMixin

from gallery.models import GalleryAlbum
from gallery.forms import GalleryAlbumForm


class GalleryAlbumCreateView(LoginRequiredMixin, CreateView):
    template_name = "gallery/gallery_album_form.html"
    form_class = GalleryAlbumForm
    success_url = reverse_lazy("dashboard:gallery:gallery-album-list")

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