Django OneToOneField出现在其他实体的ModelForm上吗?

时间:2018-07-02 22:37:33

标签: django

我有以下课程:

class Account(models.Model):
    instance = models.OneToOneField(Instance, blank=True, null=True)

class Instance(models.Model):
    is_ready = models.BooleanField(default=False, verbose_name=_('Ready?'))

现在,帐户和实例之间的关系由帐户的ModelForm通过Account.instance设置。

我希望能够通过实例上的ModelForm设置Account.instance。那可能吗?

1 个答案:

答案 0 :(得分:0)

一个ModelForm是:

  

一个帮助程序类,可让您从Django模型创建Form类。

一个想法是编写一个自定义模型字段来解决此问题。但是,根据Writing Custom Model Fields

的相关章节
  

必须以某种方式将模型中的字段转换为适合现有数据库列类型的字段。

试图发现可用的postgreSQL列类型I found this page,但似乎无法提供解决方案。

另一方面,有一个old but updated SO post,它提供了一种解决方案,该解决方案实际上在HTML页面中呈现了两种形式,并且-通过这种方式-您可以将所有需要的字段收集为一种形式。

forms.py

class AccountForm(forms.ModelForm):
    ... Do stuff if necessary ...
    class Meta:
        model = Account
        fields = ('the_fields', 'you_want')


class InstanceForm (forms.ModelForm):
    ... Do other stuff if necessary ...
    class Meta:
        model = Instance
        fields = ('the_fields', 'you_want')

views.py

...
def register(request):
    if request.method == 'POST':
        account_form = AccountForm(request.POST)
        instance_form = InstanceForm(request.POST)
        if account_form.is_valid() and instance_form.is_valid():
            account_form.save()
            instance_form.save()
...

the_template.html

<form action="." method="post">
    {% csrf_token %}
    {{ account_form.as_p }}
    {{ instance_form.as_p }}
    <input type="submit" value="Submit">
</form>

这也是管理员class InlineModelAdmin的想法。

例如,在管理员中,Account将成为Instance的内联模型(这对django类来说是一个坏名字)。

admin.py:

from django.contrib import admin


class InstanceInline(admin.TabularInline):
    model = Instance


class AccountAdmin(admin.ModelAdmin):
    inlines = [
        InstanceInline,
    ]