如何从模型字段获取Django表单字段?

问题描述 投票:0回答:5

我想创建一个包含来自两个单独模型的字段以及一些其他常规(非模型)字段的表单。该表单将创建每个模型的实例。我不认为我可以为此使用内联表单集,因为我不想包含两个模型中的所有字段。 我想创建表单字段而不对模型字段的类型进行硬编码。

我知道我可以使用

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
属性感到不舒服。或者我的处理方式完全错误?
    

python django django-models django-forms
5个回答
19
投票
django.forms.models.fields_for_model

。 这应该会给你一个字段字典,然后你可以添加表单的字段

    


13
投票

这应该很简单,只需在模板中的一个

ModelForm

标签内使用两个

Form
和一个额外的
<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,但是你可以按照你喜欢的方式渲染表单字段。祝您的网站好运。


12
投票
记录的 API

用于从模型类获取模型字段: my_model_field = MyModel._meta.get_field('my_model_field_name')

虽然直到 Django 1.8 才正式记录,但这也应该适用于早期的 Django 版本。

一旦有了这个,您就可以像这样获取表单字段:

form_field = my_model_field.formfield()



2
投票


0
投票
自 Django 3.0

起,你可以从一个名为 field_name 的单个模型字段中创建一个表单字段:

MyModel.field_name.field.formfield()

如果您的模型是 

parler.models.TranslatableModel

,并且 field_name
translations
内部,您可以使用:
MyModel.translations.field.model.field_name.field.formfield()

或者,如果您喜欢更详细但有更好记录的方法,您可以使用:

MyModel._meta.get_field("field_name").formfield()

MyModel._parler_meta.get_model_by_related_name("translations")._meta.get_field("field_name").formfield()

参见:


姜戈get_field



django-parler get_model_by_related_name

© www.soinside.com 2019 - 2024. All rights reserved.