如何将选择限制在django中的相关对象?
我正在尝试使用django来组织和管理我的临床研究数据。我想我只需要管理界面就可以了,因为这是一个不需要公开的幕后数据库。我会编程,但以前从来没有用过python,所以我一直在做一些简单的事情 我有多次就诊的患者。每次访问都需要多次扫描。在管理界面中,我可以看到所有就诊和所有扫描,如每个患者页面上的内联线。但是,在添加新扫描时,我如何使其与哪一次就诊关联的选择仅限于相关患者的就诊,而不是其他患者的就诊 模型(简化):如何将选择限制在django中的相关对象?,django,django-admin,foreign-keys,inline,Django,Django Admin,Foreign Keys,Inline,我正在尝试使用django来组织和管理我的临床研究数据。我想我只需要管理界面就可以了,因为这是一个不需要公开的幕后数据库。我会编程,但以前从来没有用过python,所以我一直在做一些简单的事情 我有多次就诊的患者。每次访问都需要多次扫描。在管理界面中,我可以看到所有就诊和所有扫描,如每个患者页面上的内联线。但是,在添加新扫描时,我如何使其与哪一次就诊关联的选择仅限于相关患者的就诊,而不是其他患者的就诊 模型(简化): 非常感谢您的帮助……我认为formfield\u for\u foreignk
非常感谢您的帮助……我认为formfield\u for\u foreignkey方法将对您有所帮助。您可以在admin类中实现它。请参阅。两个示例仅略有不同: 第一:
class ScanInlineAdmin(admin.TabularAdmin):
model = Scan
formset = ScanInlineFormset
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "visit":
patient = self.get_object(kwargs['request'], Patient)
kwargs["queryset"] = Visit.objects.filter(patient=patient)
return super(ScanInlineAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
def get_object(self, request, model):
object_id = request.META['PATH_INFO'].strip('/').split('/')[-1]
try:
object_id = int(object_id)
except ValueError:
return None
return model.objects.get(pk=object_id)
第二:
class ScanInline(admin.TabularInline):
model = Scan
formset = ScanInlineFormset
def formfield_for_dbfield(self, field, **kwargs):
if field.name == 'visit':
# Note - get_object hasn't been defined yet
patient = self.get_object(kwargs['request'], Patient)
vists = Visit.objects.filter(patient=patient)
return forms.ModelChoiceField(queryset=visits)
return super(ScanInline, self).formfield_for_dbfield(field, **kwargs)
def get_object(self, request, model):
object_id = request.META['PATH_INFO'].strip('/').split('/')[-1]
try:
object_id = int(object_id)
except ValueError:
return None
return model.objects.get(pk=object_id)
你会发现这很有帮助。我假设您在患者页面的管理员编辑/视图中输入新扫描。正确吗?谢谢您的反馈。我想我现在可以在你链接的文章的帮助下做到这一点。这对任何真正尝试使用第一个例子的人来说都是显而易见的,但以防万一,对于Django的新手来说:kwargs['request']在这里会失败。只需使用request,因为它显式地出现在args列表中。
class ScanInline(admin.TabularInline):
model = Scan
formset = ScanInlineFormset
def formfield_for_dbfield(self, field, **kwargs):
if field.name == 'visit':
# Note - get_object hasn't been defined yet
patient = self.get_object(kwargs['request'], Patient)
vists = Visit.objects.filter(patient=patient)
return forms.ModelChoiceField(queryset=visits)
return super(ScanInline, self).formfield_for_dbfield(field, **kwargs)
def get_object(self, request, model):
object_id = request.META['PATH_INFO'].strip('/').split('/')[-1]
try:
object_id = int(object_id)
except ValueError:
return None
return model.objects.get(pk=object_id)