Как разработать модель django для создания нескольких одинаковых форм
У меня есть сайт с несколькими ссылками, где каждая ссылка направляет пользователя на форму. Формы имеют перекрывающиеся атрибуты, но некоторые из них зависят от категории.
Я использую класс ModelForm
для сопоставления моей модели с полями формы.
Теперь я задаюсь вопросом, какой подход будет лучшим, чтобы у меня были все необходимые поля формы на странице отдельной формы.
Я думал о трех подходах:
- Make one really big class that contains all the form fields
- Create a single model for every individual form (lots of duplication would happen)
- 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)
Как вы видите, я передаю правильную форму в качестве контекста в файл шаблона, в котором форма затем отображается.
Моя конечная цель состоит в том, чтобы иметь возможность извлекать информацию из модели на основе отдельных категорий, изменять ее формат и выводить в документ в виде конкатенированной строки. Поэтому мне нужно иметь возможность определить, из какой формы были получены данные.
Если вам нужна дополнительная информация, пожалуйста, спрашивайте!
Спасибо.