代码之家  ›  专栏  ›  技术社区  ›  Tinker

Django OneTooneField出现在其他实体的模型上?

  •  1
  • Tinker  · 技术社区  · 7 年前

    我有以下课程:

    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的modelform通过 Account.instance 是的。

    我想能够 account.instance帐户 通过实例上的模型表单。有可能吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   raratiru    7 年前

    一个 ModelForm 是:

    一个帮助类,用于从django模型创建窗体类。

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

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

    试图找出可用的postgresql列类型 I found this page 这似乎无法提供解决方案。

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

    表单.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')
    

    视图.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()
    ...
    

    模板.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类来说是个坏名字)。

    管理.py:

    from django.contrib import admin
    
    
    class InstanceInline(admin.TabularInline):
        model = Instance
    
    
    class AccountAdmin(admin.ModelAdmin):
        inlines = [
            InstanceInline,
        ]