当前位置:  开发笔记 > 编程语言 > 正文

从模型字段中获取Django表单字段

如何解决《从模型字段中获取Django表单字段》经验,为你挑选了3个好方法。

我想创建一个表单,其中包含来自两个单独模型的字段,以及一些其他常规(非模型)字段.表单将创建每个模型的实例.我不认为我可以使用内联表单集,因为我不想包含两个模型的所有字段.

我想创建表单字段而不用硬编码模型字段的类型.

我知道我可以使用模型字段获取表单字段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已经?这是一个坏主意吗?依赖于model _meta属性我感到很不舒服.或者我是以完全错误的方式解决这个问题的?



1> 小智..:

你也可以看看django.forms.models.fields_for_model.那应该给你一个字段字典,然后你可以添加表单的字段



2> Casey W. Sta..:

除非你想要一些特殊的行为,否则你不应该自己构建字段.

这应该就像使用一个提交按钮在模板中使用两个ModelForms和一个额外的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...

并在模板中:

{% csrf_token %}
    
{{ form1|as_uni_form }} {{ form2|as_uni_form }} {{ form3|as_uni_form }}

我习惯使用django-uni-form,但你可以随意渲染表单字段.祝你的网站好运.



3> seddonym..:

现在有一个用于从模型类中获取模型字段的文档API:

my_model_field = MyModel._meta.get_field('my_model_field_name')

虽然在Django 1.8之前没有正式记录,但这也适用于早期的Django版本.

一旦你有了这个,你可以得到这样的表单字段:

form_field = my_model_field.formfield()

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有