Я хочу сделать форму для разных моделей которые наследуются от одной
class Project(models.Model):
title = models.CharField(max_length=50, verbose_name='Название')
slug = models.SlugField(verbose_name='Slug')
content = models.TextField(verbose_name='Контент')
image = models.ImageField(null=True, blank=True,upload_to='images/%Y/%m/%d', verbose_name='Изображение')
rubric = models.ForeignKey('Rubric', null=True, on_delete=models.PROTECT, verbose_name='Рубрика')
author = models.ForeignKey('accounts.User', on_delete=models.CASCADE)
tags = TaggableManager(blank=True)
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)
def __init__(self, *args, **kwargs):
super(Project, self).__init__(*args, **kwargs)
self.model_type = None
def __str__(self):
return self.title
def main_model(self, object_type=None):
if object_type:
getattr(self, object_type).model_type = object_type
else:
types_objects = ['game', 'audio', 'movies', 'blogs']
for obj_type in types_objects:
if hasattr(self, obj_type):
getattr(self, obj_type).model_type = obj_type
return getattr(self, obj_type)
def save(self, *args, **kwargs):
print(args)
self.slug = slugify(self.title)
super().save(*args, **kwargs)
class Meta:
verbose_name = 'Проект'
verbose_name_plural = 'Проекты'
ordering = ['created']
class Audio(Project):
file = models.FileField(upload_to='audio/%Y/%m/%d', verbose_name='Аудио Файл')
class Meta:
verbose_name = 'Аудио'
verbose_name_plural = 'Аудио'
ordering = ['created']
class Game(Project):
background_image = models.ImageField(upload_to='images/%Y/%m/%d', verbose_name='Изображение для страницы')
url = models.URLField(null=True, blank=True, verbose_name='URL')
yt_urls = models.URLField(null=True, blank=True, verbose_name='YouTube URL')
def save(self, *args, **kwargs):
self.yt_urls = str(self.yt_urls).replace('watch?v=', 'embed/')
super().save(args, kwargs)
class Meta:
verbose_name = 'Игра'
verbose_name_plural = 'Игры'
ordering = ['created']
class Movie(Project):
yt_urls = models.URLField(null=True, blank=True, verbose_name='YouTube URL')
class Meta:
verbose_name = 'Фильм'
verbose_name_plural = 'Фильмы'
ordering = ['created']
class Blog(Project):
class Meta:
verbose_name = 'Блог'
verbose_name_plural = 'Блоги'
ordering = ['created']
Есть форма
class ProjectForm(forms.ModelForm):
class Meta:
model = Project #Game или Audio или Movie
exclude = ('slug', 'author')
И есть контроллер:
class AddProjectView(CreateView):
template_name = 'posts/create-project.html'
form_class = ProjectForm
def post(self, request, *args, **kwargs):
self.user = request.user
return super().post(request, *args, **kwargs)
def form_valid(self, form):
form = form.save(commit=False)
form.author = self.user
return super().form_valid(form)
Как лучше сделать разные модели в одной форме? Так как я считаю что сделать разные формы и разные контроллеры под разные модели просто с дополненными полями это не практично.