Получите поле формы Django от образцового поля

Я хотел бы создать форму, которая включает поля из двух отдельных моделей, наряду с некоторыми другими обычными (необразцовыми) полями. Форма создаст экземпляр каждой модели. Я не думаю, что могу использовать встроенный formsets для этого, так как я не хочу включать все поля из обеих моделей.

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

Я знаю, что могу получить поле формы от образцового полевого использования model_field.formfield(). Но как я могу получить определенное образцовое поле?

Мое первое решение:

def get_fields(model_class):
    fields = {}
    for f in model_class._meta.fields:
        fields[f.name] = f

class MyForm(forms.Form):
    foo_name = get_fields(Foo)['name'].formfield()
    bar_name = get_fields(Bar)['name'].formfield()
    other_field = ...

Есть ли эквивалент get_fields уже? Действительно ли это - плохая идея? Я - неудобное доверие модели _meta атрибут. Или я иду об этом абсолютно неправильным путем?

17
задан harto 6 April 2010 в 10:36
поделиться

2 ответа

Вы также можете взглянуть на django.forms.models.fields_for_model. Это должно дать вам словарь полей, а затем вы можете добавить поля формы

15
ответ дан 30 November 2019 в 12:07
поделиться

Вам никогда не придется создавать поля самостоятельно, если только вы не хотите какого-то особого поведения.

Это должно быть так же просто, как использование двух ModelFormов и дополнительной Form внутри одного

тега в вашем шаблоне с одной кнопкой отправки.

в forms.py:

class Model1Form(forms.ModelForm):
    class Meta:
        model = Model1
        fields = ('fields', 'you', 'want')

class Model2Form(forms.ModelForm):
    class Meta:
        model = Model2
        fields = ('fields', 'you', 'want')

class ExtraFieldsForm(forms.Form):
    extra_field = form.TextField() # or whatever field you're looking for

в views.py:

form1 = Model1Form(request.POST or None)
form2 = Model2Form(request.POST or None)
form3 = ExtraFieldsForm(request.POST or None)

if form1.is_valid() and form2.is_valid() and form3.is_valid():
    form1.save()
    form2.save()
    form3.save()

    ...do other stuff like a redirect...

и в шаблоне:

<form method="POST" action="">{% csrf_token %}
    <fieldset>
        {{ form1|as_uni_form }}
        {{ form2|as_uni_form }}
        {{ form3|as_uni_form }}
        <div class="form_block">
            <input type="submit" value="Save both models"/>
        </div>
    </fieldset>
</form>

Я привык использовать django-uni-form, но вы можете выводить поля формы как вам угодно. Удачи с вашим сайтом.

10
ответ дан 30 November 2019 в 12:07
поделиться
Другие вопросы по тегам:

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