Я хотел бы создать форму, которая включает поля из двух отдельных моделей, наряду с некоторыми другими обычными (необразцовыми) полями. Форма создаст экземпляр каждой модели. Я не думаю, что могу использовать встроенный 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
атрибут. Или я иду об этом абсолютно неправильным путем?
Вы также можете взглянуть на django.forms.models.fields_for_model
.
Это должно дать вам словарь полей, а затем вы можете добавить поля формы
Вам никогда не придется создавать поля самостоятельно, если только вы не хотите какого-то особого поведения.
Это должно быть так же просто, как использование двух 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, но вы можете выводить поля формы как вам угодно. Удачи с вашим сайтом.