Django,在视图中显示多个模型

时间:2017-09-08 14:43:14

标签: python django django-templates django-views

因此,我想在其中一个应用视图中显示来自两个不同应用的两个模型。具体来说,我试图在他们的个人资料页面上显示用户的帖子。然而,我还没有能够弄清楚,而且我找不到任何作品。这是我的代码,请看一下。

Feed应用模型:

from django.db import models
from django.core.urlresolvers import reverse
from django.conf import settings

from django.contrib.auth import get_user_model
User = get_user_model()

# Create your models here.
class UserPost(models.Model):
    author = models.ForeignKey(User,related_name='userpost',null=True)
    post_date = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=150,blank=False)
    post_body = models.TextField(max_length=1000,blank=False)

    def publish(self):
        self.save()

    def get_absolute_url(self):
        return reverse('index')

    def __str__(self):
        return self.title

不确定您是否需要查看此内容,但这里是用户应用模型:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from users.choices import *

# Create your models here.
class UserProfileInfo(models.Model):
    user = models.OneToOneField(User)

    join_date = models.DateTimeField(default=timezone.now)
    profile_pic = models.ImageField(upload_to='profile_pics',blank=True)
    location = models.CharField(max_length=150)
    title = models.CharField(max_length=250)
    user_type = models.IntegerField(choices=USER_TYPE_CHOICES,default=1)
    website = models.URLField(max_length=100,blank=True)
    about = models.TextField(max_length=500,default='about')
    twitter = models.CharField(max_length=50,blank=True)
    dribbble = models.CharField(max_length=50,blank=True)
    github = models.CharField(max_length=50,blank=True)

    def __str__(self):
        return self.user.username

用户应用查看我希望显示两个模型的位置:

from django.shortcuts import render,get_object_or_404
from users.forms import UserForm,UserProfileForm
from users.models import UserProfileInfo
from feed.models import UserPost

from django.contrib.auth import authenticate,login,logout
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse
from django.contrib.auth.decorators import login_required

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import (TemplateView,ListView,
                                    DetailView,CreateView,
                                    UpdateView,DeleteView)

# Create your views here.
class UserProfileView(DetailView):
    model = UserProfileInfo
    template = 'users/userprofile.html'

    def get_context_data(self, **kwargs):
        context = super(UserProfileView, self).get_context_data(**kwargs)
        context['user-feed'] = UserPost.objects.all()
        return context

用户的个人资料模板(我想要使用的模板):

{% extends "base.html" %}

{% block content %}

    <div class="sidebar-userinfo">
        <img class="profile-pic" src="{{ userprofileinfo.profile_pic.url }}">
        <h2>{{ userprofileinfo.username }}</h2>
        <p class="accent">Score:</p>
        <p>Score goes here</p>
        <form>
            <button class="btn" type="submit">Follow</button>
        </form>

        <p class="accent">Title:</p>
        <p class="profile-info">{{ userprofileinfo.title }}</p>

        <p class="accent">Website:</p>
        <p class="profile-info">{{ userprofileinfo.website }}</p>

        <p class="accent">I'm a:</p>
        {% if request.user.userprofileinfo.user_type == 1 %}
            <p class="profile-info">Designer</p>
        {% elif request.user.userprofileinfo.user_type == 2 %}
            <p class="profile-info">Designer</p>
        {% else %}
            <p class="profile-info">Both</p>
        {% endif %}

        {% if userprofileinfo.about %}
            <p class="accent">About Me:</p>
            <p class="profile-info">{{ userprofileinfo.about }}</p>
        {% endif %}

        <p class="accent">Member Since:</p>
        <p class="profile-info">{{ userprofileinfo.join_date }}</p>

        {% if userprofileinfo.location %}
            <p class="accent">Location:</p>
            <p class="profile-info">{{ userprofileinfo.location }}</p>
        {% endif %}

        {% if userprofileinfo.twitter %}
            <p class="accent">Twitter:</p>
            <p class="profile-info">{{ userprofileinfo.twitter }}</p>
        {% endif %}

        {% if userprofileinfo.dribbble %}
            <p class="accent">Dribbble:</p>
            <p class="profile-info">{{ userprofileinfo.dribbble }}</p>
        {% endif %}

        {% if userprofileinfo.github %}
            <p class="accent">Git Hub:</p>
            <p class="profile-info">{{ userprofileinfo.github }}</p>
        {% endif %}
    </div>

    <div class="content-right">
        {% include 'feed/userpost_list_inner.html' %}
    </div>

{% endblock %}

上面的包含声明会导致此文件:

{% for post in userpost_list %}
    <div class="post">
        <h2 class="post-title">{{ userpost.post.title }}</h2>
        <p class="accent">{{ post.author }}</p>
        <p class="accent">{{ post.post_date }}</p>
        <p class="body">{{ post.post_body }}</p>
    </div>
{% endfor %}

1 个答案:

答案 0 :(得分:0)

在使用它之后,我能够使用我的问题中的代码让它工作。我在这里使用user-feed作为我的上下文名称:

context['user-feed'] = UserPost.objects.all()

问题在于我没有在模板中调用正确的名称:

{% for post in userpost_list %}

所以那不匹配。我将视图中的上下文名称更改为user_post,然后在模板中也将其更改为

{% for post in user_post %}

这解决了这个问题。简而言之,我只是没有正确连接它们。