2016-11-09 56 views
2

我有例如邮政与ID 后我上传一个或多个图像被显示在分贝为:蟒 - Django的显示上传的多个图像与外键

  1. ID(例如:1 ,2,3)
  2. 链接直接图像(例如:我的图像/ image.png)
  3. foreing_id(那是ID张贴即)

但是我不知道如何显示在模板中为这个职位的图像(和其他人当然)

我的模型:

class Post(models.Model): 
    title = models.CharField(max_length=20000) 
    date = models.DateTimeField(editable=True, null=True) 
    text = models.TextField(max_length=50000) 
    is_super = models.IntegerField(default=0) 

class Image(models.Model): 
    foreing = models.ForeignKey(Post) 
    image = models.ImageField(null=True, blank=True, upload_to='my-images') 

视图,其中i上传和显示所有帖子(在这里,我展示) :

class IndexView(generic.ListView): 
    paginate_by = 4 
    template_name = 'home/index.html' 
    context_object_name = 'all_posts' 

    def get_queryset(self): 
     query = self.request.GET.get('q') 
     if query: 
      posts = Post.objects.filter(
       Q(text__icontains=query.capitalize()) | 
       Q(title__icontains=query.capitalize()) | 
       Q(text__icontains=query.lower()) | 
       Q(title__icontains=query.lower()) 
      ).distinct() 
      return posts 
     else: 
      return Post.objects.filter(date__lte=timezone.now()).order_by('-date') 

有我创建了一个新的职位:

def post_new(request): 
    ImageFormSet = modelformset_factory(Image, form=ImageForm, extra=3) 
    if request.method == "POST": 
     form = PostForm(request.POST, request.FILES or None) 
     formset = ImageFormSet(request.POST, request.FILES, queryset=Image.objects.none()) 
     if form.is_valid() and formset.is_valid(): 
      post = form.save(commit=False) 
      post.date = timezone.now() 
      post.save() 
      for form in formset.cleaned_data: 
       image = form['image'] 
       photo = Image(foreing_id=post.id, image=image) 
       photo.save() 
      return render(request, 'home/page.html') 
     else: 
      form = PostForm() 
     return render(request, 'home/edit_post.html', 
        {'form': form, 'error_message': 'something error message'}) 
    else: 
     form = PostForm() 
     formset = ImageFormSet(queryset=Image.objects.none()) 
    return render(request, 'home/edit_post.html', {'form': form, 'formset': formset}) 

这里我需要显示IMA这一切的帖子GES:

这里是一个图像显示

 <div class="profile-img-container" style="text-align: center"> 
      <img class="img" src="images"> 
      <a target="_blank" title="****." href="URL to the uploaded image"><span class="fa fa-expand fa-5x" style="color: darkcyan" aria-hidden="true"></span></a> 

充分的index.html如果需要

<div class="content"> 
{% for post in all_posts %} 
    <div class="thumbnail"> 
     <p style="text-align: center">{{ post.title }}</p> 
      <p class="text" style="text-align: center; height: 40px; overflow: hidden">{{ post.text }}</p> 
       <p><a type="button" class="btn btn-primary" href="{% url 'klass:detail' post.id %}">More...</a></p> 
      <div class="profile-img-container" style="text-align: center"> 
       <img class="img" src="/media/**display images**" style="height: 150px"> 
       <a target="_blank" title="****." href="**url to images**"><span class="fa fa-expand fa-5x" style="color: darkcyan" aria-hidden="true"></span></a> 
      </div> 
      {% if user.is_authenticated %} 
       <form method="post" style="text-align: right"> 
       <p> 
        {% csrf_token %} 
        <a methods="post" role="button" class="btn btn-info" href="{% url 'klass:favorite' post.id %}"> 
         <i class="fa fa-heart" style="color: red" aria-hidden="true"></i>great! {{ post.is_super }} 
        </a> 
       </p> 
       </form> 
       <span style="margin-left: 90px">Published: {{ post.date }}</span> 
      {% else %} 
       <p style="text-align: right">****<br> 
       <a role="button" class="btn btn-info disabled" style="text-align: right"> 
       <i class="fa fa-heart" aria-hidden="true"></i>great!</a> 
       {{ post.date }} 
       </p> 
      {% endif %} 
    </div> 
{% endfor %} 

编辑

网址:

from django.conf.urls import url, include 
from django.contrib import admin 
from django.conf import settings 
from django.conf.urls.static import static 

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^home_page/', include('home.urls', namespace='home')), 
    url(r'^captcha/', include('captcha.urls')), 
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

设置:

STATIC_URL = '/static/' 

STATICFILES_DIRS = [ 
    os.path.join(BASE_DIR, 'home/static'), 
] 

MEDIA_URL = '/media/' 

MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 

另一个网址,在家庭应用:

from django.conf.urls import url 
from . import views 

app_name = 'home' 

urlpatterns = [ 
    ***, 
    url(r'^$', views.IndexView.as_view(), name='index'), 
    url(r'^(?P<post_id>[0-9]+)/$', views.comments, name='detail'), 
    url(r'^(?P<post_id>[0-9]+)/addcomment$', views.addcomment, name='comment'), 
    url(r'^(?P<post_id>[0-9]+)/favorite/$', views.favorite, name='favorite'), 
    url(r'^(?P<pk>[0-9]+)/edit/$', views.post_edit, name='edit'), 
    url(r'^post/new/$', views.post_new, name='post_new'), 
    url(r'^(?P<post_id>[0-9]+)/delete_album/$', views.delete_post, name='delete_post'), 
    ****, 
] 
+2

请更正您的缩进。您应该遍历'post.image_set.all'并分别显示每个图像。 – Selcuk

+0

@Selcuk Not Found:/ media/]>,但我有更多的3 – MoDDem

+0

@Selcuk也许我错误地表达了它有问题。我更正确地改变了它 – MoDDem

回答

1

你应该通过post.image_set.all循环并单独显示每个图像,例如:

{% for image in post.image_set.all %} 
<div class="profile-img-container" style="text-align: center"> 
    <img class="img" src="{{ image.image.url }}" style="height: 150px"> 
    <a target="_blank" href="{{ image.image.url }}"> 
    <span class="fa fa-expand fa-5x" style="color: darkcyan" aria-hidden="true"></span> 
    </a> 
</div> 
{% endfor %} 

一一些附注:

  1. 你不应该在你的图片url中包含/media,因为它会被Django自动添加。

  2. 为了便于阅读,建议不要将您的外键命名为foreign(也请检查拼写)。考虑重命名它为小写使用父模型的名称(如post),而不是使之成为post = models.ForeignKey(Post)

  3. 引用使用_id外键不建议。例如:使用模型本身,例如:photo = Image(post=post, image=image)

+0

令人难以置信!我无法表达我的感受!非常感谢你! – MoDDem

+0

@塞尔丘克,这在我身边没问题,但我有一个挑战,从'image_set'显示选定的图像。它是一个精选的图像,但通过单选按钮作为布尔字段选择,这里是我的问题(https://stackoverflow.com/questions/44159559/need-to-have-a-必需 - 和 - optional-fields-in- Django的表单集) – dungu