【问题标题】:Django OneToOneField show up on ModelForm of other entity?Django OneToOneField 出现在其他实体的 ModelForm 上?
【发布时间】:2018-07-02 22:37:32
【问题描述】:

我有以下课程:

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?'))

现在,Account 和 Instance 之间的关系是通过 Account.instance 为 Account 设置的 ModelForm。

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

【问题讨论】:

  • 当您定义ModelForm 时,在其Meta 类中,您必须定义model 属性和fields 属性。在fields 属性中,无法输入来自另一个模型的字段。通过其构造,forms.ModelForm 专用于一个models.Model
  • 您找到更好的解决方案了吗?
  • @raratiru 我将该字段移到模型中
  • 因此,您可以放心地假设您的问题is answered

标签: django


【解决方案1】:

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的想法。

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

admin.py:

from django.contrib import admin


class InstanceInline(admin.TabularInline):
    model = Instance


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

【讨论】:

  • 我不认为这就是我要寻找的,因为我在这里指的不是管理员。
  • @Sparrowcide 谢谢你的澄清,我已经更新了我的答案。
  • 感谢您的回答!您是否认为使用两个表单实际上比使用包含所有实例字段和一个来自帐户 (Account.instance) 字段的自定义表单更容易?
  • @Sparrowcide 从技术上讲,您可以在InstanceForm 中创建一个安慰剂OneToOne 字段,并注意为其提供初始值和操作,以更新对Instance 的任何更改。根据我的经验,这需要一个非常好的理由,强大的编码技能和许多限制,这将严重缩小其潜力。通过使用两个表单,验证和保存操作开箱即用,您还可以选择向用户显示哪些字段。
猜你喜欢
  • 1970-01-01
  • 2015-03-06
  • 2020-07-03
  • 2014-09-23
  • 2012-11-21
  • 1970-01-01
  • 2013-03-10
  • 2013-05-15
  • 1970-01-01
相关资源
最近更新 更多