Masik
@Masik
Программирую понемногу

Возможно ли переписать код, чтобы ReportForm сам определял, какую модель брать по ее имени?

Есть рабочий код
class ReportForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(ReportForm, self).__init__(*args, **kwargs)
        for key in self.fields.keys():
            self.fields[key].widget = forms.TextInput(attrs={'class': 'form-control'})

class ReportOne(ReportForm):

    class Meta:
        model = models.ReportOne
        exclude = ('pk', 'code', )


class ReportTwo(ReportForm):

    class Meta:
        model = ReportTwo
        exclude = ('pk', 'code', )


Хотелось, чтобы ReportForm сам определял, какую модель брать по ее имени.
  • Вопрос задан
  • 2457 просмотров
Решения вопроса 1
Masik
@Masik Автор вопроса
Программирую понемногу
Решил таким способом, так и хотел
class ReportForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.Meta.model = getattr(models, args[0])
        self.Meta.exclude = ('pk', 'code')
        super(ReportForm, self).__init__(*args, **kwargs)
        for key in self.fields.keys():
            self.fields[key].widget = forms.TextInput(attrs={'class': 'form-control'})


Вызов соответственно такой:
ReportForm('ReportOne')
ReportForm('ReportTwo')
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@kfuntov
class ReportForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(ReportForm, self).__init__(*args, **kwargs)
        for key in self.fields.keys():
            self.fields[key].widget = forms.TextInput(attrs={'class': 'form-control'})

    @staticmethod
    def getInstance(name, *args, **kwargs):
         if name == "one":
             return ReportOne(*args, **kwargs)
        else:
            return ReportTwo(*args, **kwargs)


Не уверен в том, что имелось в виду под "по её имени", но теперь можно будет создавать формы так:
newform = ReportForm.getInstance("one")
newform = ReportForm.getInstance("two")
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы