настроить формы, которые генерируются общими представлениями редактирования django - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь понять процесс создания общих представлений формы в django.У меня есть общий класс представления с

class BookUpdate(UpdateView):
    model = Book
    fields = [  'name',
                'pages',
                'categorys'
                ]

, который автоматически генерирует рабочую HTML-форму из моих данных модели.Но теперь я хочу изменить поле, отображаемое для categorys, есть ли способ сделать это, или мне нужно создать полный рабочий класс BookForm и пользовательский класс BookUpdate?Здесь всего 3 поля, но в моем реальном случае может быть 15 полей, которые мне нужно было бы кодировать самостоятельно, просто из-за небольшого изменения в поле category.

Не могу просто перезаписать одиночноеполе, используя любой метод класса?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Вам не нужно кодировать поля самостоятельно.Но есть небольшой объем работы, так как нет способа переопределения.

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

class BookForm(forms.ModelForm): 
     categorys = forms.ModelMultipleChoiceField(custom_attributes_here...)

    class Meta:
        model = Book
        fields = ["name", "pages", "categorys"]

А теперь скажите, что вы хотите использовать эту форму:

class BookUpdate(UpdateView):
    form_class = BookForm
0 голосов
/ 04 марта 2019

Вы можете указать fields или form_class в своем общем представлении на основе классов.С fields Django будет использовать modelform_factory для генерации формы.Тогда вам не так много можно настроить.

Вы должны создать класс BookForm, чтобы вы могли настраивать поля.В вашем представлении BookUpdate вам нужно только удалить fields и добавить form_class = BookForm.Здесь я настраиваю виджет для categorys и переопределяю поле формы для pages:

def BookUpdate(UpdateView):
    model = Book
    form_class = BookForm

def BookForm(ModelForm):
    pages = MyCustomPagesField()

    class Meta:
        model = Book
        fields = '__all__'
        widgets = {'categorys': MyCustomWidget()}

Обратите внимание, что вам не нужно указывать все поля, вы можете использовать "__all__", чтобы иметьвсе поля или вы можете установить exclude = [<list fields to exclude>], чтобы исключить пару.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...