Как разработать модель django для создания нескольких одинаковых форм

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

Я использую класс ModelForm для сопоставления моей модели с полями формы.

Теперь я задаюсь вопросом, какой подход будет лучшим, чтобы у меня были все необходимые поля формы на странице отдельной формы.

Я думал о трех подходах:

  1. Make one really big class that contains all the form fields
  2. Create a single model for every individual form (lots of duplication would happen)
  3. Create a base model from which I inherit the fields that are widely used and then one individual model for every form.

Проблема заключается в том, что метки отличаются для конкретных форм (в одной форме может потребоваться метка "Полное название книги", а в другой - "Полное название журнала"). Поэтому мне нужно иметь возможность изменять метки в зависимости от того, в какой форме я их использую.

Сейчас мой код выглядит следующим образом (я не очень доволен им)

models.py:

class JournalModel(models.Model):
    full_publication_title = models.CharField(max_length=250)
    is_instrumental = models.BooleanField()
    journal = models.CharField(max_length=len(
        journal_categories), choices=prepare_journal_choices(), default='other_journal')

class ProceedingsModel(models.Model):
    full_title_of_the_publications_in_the_proceedings = models.CharField(max_length=250)
    is_instrumental = models.BooleanField()
    full_title_of_the_conference = models.TextField()

class TalksModel(models.Model):
    title = models.CharField(max_length=250)
    ...

etc.

Тогда, в моем forms.py:


# wrapper function that displays the correct model based on the url path (see views.py)
def form_factory(model_form):
    class MakeForm(ModelForm):
        class Meta:
            model = model_form
            fields = '__all__'
    return MakeForm

views.py:


form_switcher = {
    '/journals/': JournalModel,
    '/proceedings/': ProceedingsModel,
    '/books/': BooksModel,
    '/talks/': TalksModel,
    '/poster/': PosterModel,
    '/habilitations/': HabilitationsModel,
    '/phd_thesis/': PhdThesisModel,
    '/bachelor_master_diploma_thesis': BachelorMasterDiplomaThesisModel,
    etc.
}


def categories(response):
    model_form = form_switcher.get(response.path, None)
    form = form_factory(model_form)
    context = {'form': form}
    return render(response, "main/category.html", context)

Как вы видите, я передаю правильную форму в качестве контекста в файл шаблона, в котором форма затем отображается.

Моя конечная цель состоит в том, чтобы иметь возможность извлекать информацию из модели на основе отдельных категорий, изменять ее формат и выводить в документ в виде конкатенированной строки. Поэтому мне нужно иметь возможность определить, из какой формы были получены данные.

Если вам нужна дополнительная информация, пожалуйста, спрашивайте!

Спасибо.

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