@vadiculus

Как сделать одну форму для разных моделей Django?

Я хочу сделать форму для разных моделей которые наследуются от одной
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)


Как лучше сделать разные модели в одной форме? Так как я считаю что сделать разные формы и разные контроллеры под разные модели просто с дополненными полями это не практично.
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы