【问题标题】:How do I link a Django foreign key selected in a form with an inline form?如何将表单中选择的 Django 外键与内联表单链接?
【发布时间】:2025-12-15 16:45:01
【问题描述】:

简介

你好!我是一名自学成才的 Python/Django 编码员,正在开发我的家族企业卡车维护 Django 应用程序。我已经掌握了 Django 和 python3 的一些基础知识,但其他基础知识却让我无法理解,因为我所学的一切都是为了实用而完成的,而不是建立在这些语言的基础之上。

我有以下几种型号:

  • 卡车 - 一辆卡车
  • 服务 - 单个卡车的维修/保养服务实例
  • 照片 - photologue 应用中的单张照片
  • PhotoExtended - 与 Photo 一对一的附加模型,可以将其链接到卡车和/或服务。照片将始终与卡车相关联,但可能与服务相关联,也可能不相关。

相关模型.py:

class PhotoExtended(models.Model):

    # Link back to Photologue's Photo model.
    photo = models.OneToOneField(Photo, related_name='extended', on_delete=models.RESTRICT)
    truck = models.ForeignKey('Truck', on_delete=models.CASCADE, 
                        default = DEFAULT_TRUCK_ID, help_text="Truck in the picture.")
    service = models.ForeignKey('Service', on_delete=models.PROTECT,
                        null=True, blank=True, help_text="Service being performed or finished in the picture.")
    receipt = models.BooleanField(help_text="Is the picture for a receipt?", null=True, default=False)
    
    # Boilerplate code to make a prettier display in the admin interface.
    class Meta:
        verbose_name = u'Associated photo'
        verbose_name_plural = u'Associated photos'

    def __str__(self):
        return self.photo.title

手头的问题

在设置的管理表单中,我有一个带有内联 PhotoExtended 表单的漂亮服务表单;但是,我还没有弄清楚如何使用表单中选择的值更新 PhotoExtended 卡车外键。我找到的很多答案都可以追溯到 Django 的早期版本,因此将它们更新到当前规范对我来说不起作用。

缩短 admin.py:

from django.contrib import admin
from django.utils.translation import ugettext_lazy
from django.urls import reverse
from photologue.admin import PhotoAdmin as PhotoAdminDefault, PhotoAdminForm
from photologue.models import Photo
from .models import Truck, Service, PhotoExtended

class PhotoExtendedInline(admin.StackedInline):
    model = PhotoExtended
    max_num=4
    extra=0
    can_delete = True
class PhotoAdmin(PhotoAdminDefault):
    inlines = [PhotoExtendedInline, ]
    view_on_site=False

class ServiceAdmin(admin.ModelAdmin):
...
    inlines = [
        PhotoExtendedInline,
    ]
    date_hierarchy = 'service_date'
...

简而言之,我需要一种方法来访问在父表单中输入的信息,并使用它在内联表单中预填充 Truck 外键。服务外键会自动链接,但不是卡车的外键。

对于我的问题的任何和所有帮助,我将不胜感激。谢谢!

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    我想通了!的种类。它仅适用于已保存的表单。

    首先,我必须在 ServiceAdmin 表单中添加一个类:

        def get_form(self, request, obj=None, **kwargs):
            request._service_obj = obj
            return super(ServiceAdmin, self).get_form(request, obj, **kwargs)
    

    然后,对于 Inline 表单,我不得不添加一个外键表单方法:

        def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
            formfield = super(PhotoExtendedInline_Service, self).formfield_for_foreignkey(db_field, request, **kwargs)
            if db_field.name == 'truck':
                if request._service_obj is not None:
                    formfield.queryset = formfield.queryset.filter(service__exact = request._service_obj)
                else:
                    formfield.queryset = formfield.queryset.none()
            return formfield
    

    我希望这对未来的程序员有所帮助!

    【讨论】: