Как работать с несколькими 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")