DjangoModelForm: как добавить дополнительные поля и предварительно обработать их перед отправкой в ​​представления - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть форма модели, которая отображает все поля:

class BatchForm(ModelForm):

    class Meta:
        model = Batch
        fields = ('__all__')

Работает нормально и показывает все поля в видах. Теперь я хочу добавить в эту форму дополнительные поля, которых нет в модели. Эти поля:

completed_tasks: int
statistics: array

Затем я хочу добавить 2 формы в форму, которые автоматически заполняют эти поля перед отправкой в ​​представление. Методы будут такими:

def completed_tasks_method(self, obj):
    return obj.assignments_per_task * obj.total_tasks()

def statistics_method(self, obj):
    #something

Я не могу понять, как расширить форму модели, чтобы добавить дополнительные атрибуты, а затем как заполнить поля перед отправкой их в представления. Можете ли вы помочь? Благодаря.

1 Ответ

1 голос
/ 24 февраля 2020

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

class BatchForm(ModelForm):
    completed_tasks = forms.IntegerField()
    statistics = forms.MultipleChoiceField()
    # or whateer fields you want to use
    class Meta:
        model = Batch
        fields = ('__all__')

в представлениях

form = BatchForm(initial={'completed_tasks', <VALUE>, 'statistics': <VALUE>})

Или, если вы хотите сделать это с помощью методов, вы можете делать

class BatchForm(ModelForm):
    completed_tasks = forms.IntegerField()
    statistics = forms.MultipleChoiceField()
    # or whateer fields you want to use
    class Meta:
        model = Batch
        fields = ('__all__')

    def __init__(self, *args, **kwargs):
        super(BatchForm, self).__init__(*args, **kwargs)
        if self.instance:
            self.initial['completed_tasks'] = self.completed_tasks_method(self.instance)
            self.initial['statistics'] = self.statistics_method(self.instance)

    def completed_tasks_method(self, obj):
        return obj.assignments_per_task * obj.total_tasks()

    def statistics_method(self, obj):
        # something
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...