Есть ли способ настроить порядок нескольких полей для формы. Класс Form с полем, инициированным __init__? - PullRequest
1 голос
/ 05 мая 2019

Когда я рендерим форму в шаблон HTML, определенное поле формы, которое инициируется init , упорядочено всегда внизу таблицы, хотя я определил поле в середине класса формы.

Есть ли способ или способ настроить порядок полей в форме, где существует инициированное поле, с помощью init . Я хочу поместить поле в середину таблицы формы в шаблоне HTML.

Скриншот представленного шаблона: На скриншоте поле "имя_категории" упорядочено внизу тега Я хочу изменить порядок на середину стола.

Я использую Django 2.2 и python 3.7 в Windows 10.

Спасибо

from django import forms
from .models import Category_name

class MakePurchaseLog(forms.Form):
    buy_date = forms.DateField(input_formats=['%Y-%m-%d'])
    shop = forms.CharField(max_length=50)
    def __init__(self, user, *args, **kwargs):
        super(MakePurchaseLog, self).__init__(*args, **kwargs)
        self.fields['category_name'] = forms.ChoiceField(
                choices = [(item.category_name, item.category_name) \
                           for item in Category_name.objects. \
                           filter(owner=user)])
    goods_name = forms.CharField(max_length=50)
    price = forms.IntegerField(min_value=0)
    memo = forms.CharField(max_length=50, required=False)

    field_order = ['category_name']

1 Ответ

0 голосов
/ 05 мая 2019

Тот факт, что __init__ находится в середине класса, не будет иметь никакого значения, поскольку это функция, и поэтому оценка "откладывается" до тех пор, пока вы фактически не создадите объект формы MakePurchaseLog.

Я думаю, что самое элегантное решение здесь - просто определить поле в вашей форме, а затем в функции __init__ изменить варианты, например:

class MakePurchaseLog(forms.Form):

    buy_date = forms.DateField(input_formats=['%Y-%m-%d'])
    shop = forms.CharField(max_length=50)
    <b>category_name = forms.ChoiceField()</b>
    goods_name = forms.CharField(max_length=50)
    price = forms.IntegerField(min_value=0)
    memo = forms.CharField(max_length=50, required=False)

    def __init__(self, user, *args, **kwargs):
        super(MakePurchaseLog, self).__init__(*args, **kwargs)
        <b>self.fields['category_name'].choices</b> = [
            (item.category_name, item.category_name)
            for item in Category_name.objects.filter(owner=user)
        ]

Таким образом, мы заполняем choices поля category_name в функции __init__, но мы определяем поле уже на уровне класса.

...