Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将选择限制在django中的相关对象?_Django_Django Admin_Foreign Keys_Inline - Fatal编程技术网

如何将选择限制在django中的相关对象?

如何将选择限制在django中的相关对象?,django,django-admin,foreign-keys,inline,Django,Django Admin,Foreign Keys,Inline,我正在尝试使用django来组织和管理我的临床研究数据。我想我只需要管理界面就可以了,因为这是一个不需要公开的幕后数据库。我会编程,但以前从来没有用过python,所以我一直在做一些简单的事情 我有多次就诊的患者。每次访问都需要多次扫描。在管理界面中,我可以看到所有就诊和所有扫描,如每个患者页面上的内联线。但是,在添加新扫描时,我如何使其与哪一次就诊关联的选择仅限于相关患者的就诊,而不是其他患者的就诊 模型(简化): 非常感谢您的帮助……我认为formfield\u for\u foreignk

我正在尝试使用django来组织和管理我的临床研究数据。我想我只需要管理界面就可以了,因为这是一个不需要公开的幕后数据库。我会编程,但以前从来没有用过python,所以我一直在做一些简单的事情

我有多次就诊的患者。每次访问都需要多次扫描。在管理界面中,我可以看到所有就诊和所有扫描,如每个患者页面上的内联线。但是,在添加新扫描时,我如何使其与哪一次就诊关联的选择仅限于相关患者的就诊,而不是其他患者的就诊

模型(简化):


非常感谢您的帮助……

我认为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)