我想创建一个包含来自两个单独模型的字段以及一些其他常规(非模型)字段的表单。该表单将创建每个模型的实例。我不认为我可以为此使用内联表单集,因为我不想包含两个模型中的所有字段。 我想创建表单字段而不对模型字段的类型进行硬编码。
我知道我可以使用
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
和一个额外的 <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,但是你可以按照你喜欢的方式渲染表单字段。祝您的网站好运。
起,你可以从一个名为 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_model_by_related_name