2017-09-08 2 views
1

Donc, je voudrais montrer deux modèles de deux applications différentes dans l'une des applications vues. Plus précisément, j'essaie d'afficher le flux de posts de l'utilisateur sur sa page de profil. Cependant, je n'ai pas été capable de comprendre et rien que j'ai trouvé fonctionne. Voici mon code, s'il vous plaît jeter un oeil.Django, montrant plus d'un modèle en vue

modèles app 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 

ne suis pas sûr si vous avez besoin de voir cela, mais voici les modèles d'applications utilisateurs:

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 

Utilisateurs app Voir où je veux les deux modèles à affichage:

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 

modèle de profil de l'utilisateur (le modèle que je veux utiliser avec):

{% 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 %} 

La déclaration d'inclusion ci-dessus conduit à ce fichier:

{% 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 %} 

Répondre

0

Après avoir joué avec un peu plus j'ai pu le faire fonctionner en utilisant le code dans ma question. J'utilisais user-feed comme mon nom de contexte ici:

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

Et le problème est que je ne demande pas le bon nom dans mon modèle:

{% for post in userpost_list %}

Donc ce n'était pas Correspondre. J'ai changé le nom du contexte dans la vue de user_post puis changé dans le modèle ainsi

{% for post in user_post %}

Ce résolu le problème. Bref, je ne les connectais pas correctement.