模板中的Django外键关系

Posted

技术标签:

【中文标题】模板中的Django外键关系【英文标题】:Django foreign key relation in template 【发布时间】:2012-08-30 04:53:49 【问题描述】:

我知道你会说这个问题被问过很多次但我还没有解决它......

模型.py

class Doc(UploadModel):
    doc_no =  models.CharField(max_length=100, verbose_name = "No", blank=True)
    date_added = models.DateTimeField(verbose_name="Date", default=datetime.now,
                 editable=False)

class DocImage(models.Model):
    property = models.ForeignKey(Doc, related_name='images')
    image = FileBrowseField("Docs", max_length=200,
            directory="doc_img/%Y/%m/%d/%H/%M/%S/", 
            extensions=[".jpg",".tif"], blank=True, null=True)

views.py

def doc_detail(request, dosc_no):

    res = Doc.objects.filter(doc_no = dosc_no)        
    return render_to_response("doc/doc_detail.html",  "result": res)

模板:

% for i in docimage.property_set.all %

 i.image.url   

% endfor %

我已经尝试过上面的模板,但我没有得到任何结果。所以我想在 DocImage 类中获取 imageurl 地址...

所有的帮助

【问题讨论】:

也许上面没有包含它,但是在您看来,您将docimage 传递到模板上下文的哪个位置?我能看到的只是通过result。此外,要从 DocImage 类访问文档,您应该能够使用 property***_set 表示法用于您没有明确设置相关名称的父类 @will-hart 你能分享一个代码让你的答案得到结果吗? 【参考方案1】:

如果您查看foreign key documentation,如果您有类似的关系

Doc -> has many DocImages

你需要像这样在 DocImages 类上定义你的外键:

class DocImage(models.Model):
    property = models.ForeignKey(Doc, related_name='images')

如果您不设置相关名称,您可以从 Doc 中访问 DocImages,例如:

Doc.docimage_set.all()

Related Objects上的文档

但是在属性字段中设置related_name 可以让你这样做

Doc.images.all()

只需确保您在视图上下文中传递给模板的任何内容都与模板中使用的内容相匹配,例如

# in the view
return render_to_response('mytemplate.html',  'mydoc' : doc, 'mydocimage' : img 

然后可以在模板中使用如下:

# and in your template to get the images attached to the document
% for i in mydoc.images.all %
    ...
% endfor %

# or to get the document the image belongs to
 mydocimage.property.date_added 

【讨论】:

是否可以从模板中调用单个特定的img?即没有循环? @Josh 听起来你应该单独问这个问题。【参考方案2】: 首先迭代结果 Doc 相关的图像由 doc 的 images 属性检索,该属性由 ForeignKey 中的 related_name 属性生成

代码:

% for doc in result %
  % for docimage in doc.images.all %
     docimage.image.url 
  % endfor %
% endfor %

【讨论】:

有了这样的逻辑,你甚至不需要使用外键。如果所有对象都在上下文中,则可以循环直到键匹配。效率不高,但适用于基本结构。

以上是关于模板中的Django外键关系的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 模板中使用外键作为变量

Django模型加入一对多关系以在模板中显示

模板中的 Django 外键

在 django 模板中显示外键值

html模板中的django外键表字段

Django:遍历模板中的过滤列表