如何 link 在具有内联表单的表单中选择 Django 外键?
How do I link a Django foreign key selected in a form with an inline form?
简介
您好!我是一名自学成才的 python/Django 编码员,正在开发我的家族企业卡车维护 Django 应用程序。我掌握了 Django 和 python3 的一些基础知识,但其他基础知识让我无法理解,因为我正在学习的一切都是为了实用而完成的,而不是从这些语言的基础上构建的。
我有以下几种型号:
- 卡车 - 一辆卡车
- 服务 - 单个卡车repair/maintenance服务的单个实例
- 照片 - 来自 photologue 应用程序
的单张照片
- PhotoExtended - 与照片一对一的附加模型,它可以链接到卡车 and/or 服务。照片将始终与卡车相关联,但可能与服务相关联也可能不相关联。
相关models.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 外键。服务外键自动链接,但不是卡车的外键。
对于我的问题的任何帮助,我将不胜感激。谢谢!
我想通了!有点儿。它仅适用于已保存的表格。
首先,我必须在 ServiceAdmin 表单中添加 class:
def get_form(self, request, obj=None, **kwargs):
request._service_obj = obj
return super(ServiceAdmin, self).get_form(request, obj, **kwargs)
然后,对于内联表单,我不得不添加一个外键表单方法:
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
我希望这对未来的程序员有帮助!
简介
您好!我是一名自学成才的 python/Django 编码员,正在开发我的家族企业卡车维护 Django 应用程序。我掌握了 Django 和 python3 的一些基础知识,但其他基础知识让我无法理解,因为我正在学习的一切都是为了实用而完成的,而不是从这些语言的基础上构建的。
我有以下几种型号:
- 卡车 - 一辆卡车
- 服务 - 单个卡车repair/maintenance服务的单个实例
- 照片 - 来自 photologue 应用程序 的单张照片
- PhotoExtended - 与照片一对一的附加模型,它可以链接到卡车 and/or 服务。照片将始终与卡车相关联,但可能与服务相关联也可能不相关联。
相关models.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 外键。服务外键自动链接,但不是卡车的外键。
对于我的问题的任何帮助,我将不胜感激。谢谢!
我想通了!有点儿。它仅适用于已保存的表格。
首先,我必须在 ServiceAdmin 表单中添加 class:
def get_form(self, request, obj=None, **kwargs):
request._service_obj = obj
return super(ServiceAdmin, self).get_form(request, obj, **kwargs)
然后,对于内联表单,我不得不添加一个外键表单方法:
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
我希望这对未来的程序员有帮助!