2016-03-06 73 views
1

访问数据我有点难住。所以,我有两个型号,如图models.py两个相关的模型,通过request.user

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    activation_key = models.CharField(max_length=40, blank=True) 
    key_expires = models.DateTimeField(default=datetime.date.today()) 

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

    class Meta: 
     verbose_name_plural='User profiles' 


class ImageDoc(models.Model): 
    user = models.ForeignKey(UserProfile) 
    imgfile = models.ImageField(upload_to='images/') 

这是一个简单的个人资料功能,和我想要做的是只涉及到用户显示图像,他们在登录后。

这里是我的views.py文件:

def sign_in(request): 
    context = RequestContext(request) 

    if request.method == 'POST': 
     username = request.POST['username'] 
     password = request.POST['password'] 
     user = authenticate(username=username, password=password) 

     if user: 
      if user.is_active: 
       login(request, user) 
       return HttpResponseRedirect('/', context) 
      else: 
       return HttpResponse("Verify your account!") 
     else: 
      return HttpResponse("Invalid login details supplied.") 


def populateContext(request, context): 
    context['authenticated'] = request.user.is_authenticated() 
    if context['authenticated'] == True: 
     context['username'] = request.user.username 


def index(request): 
    context = {} 
    populateContext(request, context) 

    context.update(image_gallery = ImageDoc.objects.only('imgfile')) 
    return render(request, 'index.html', context) 

在index.html页面中,我可以显示已登录的用户,这要感谢上面的populateContext。这包括这些:

{{ request.user.first_name }} {{ request.user.last_name }} {{ request.user.username }} {{ request.user.email }} {{ request.user.id }} 

但是,我不知道如何从相关模型中显示“imgfile”。它的工作原理,如果我这样做:

{% for x in image_gallery %} 
    <img src="{{ x.imgfile }}"> 
{% endfor %} 

但仅仅是因为我更新了上面的情况下将其包含在理想的情况下我想要的图像只显示特定用户的页面上。完全像一个会员画廊。预先感谢您的任何帮助。

回答

1

你可以写一个简单的方法UserProfile模型,将返回所有相关images当前user

class UserProfile(models.Model): 
    # some stuff here 

    def get_images(self): 
     return ImageDoc.objects.filter(user=self) 

现在,你可以在模板中访问images

{% for image in user.userprofile.get_images %} 
    <img src="{{ image.imgfile }}"> 
{% endfor %} 
+0

太棒了!它像一个魅力。这是唯一的方法吗? – Bob

+1

根本不需要定义'get_images'。 Django已经提供了反向访问者'imagedoc_set',所以你可以在'user.userprofile.imagedoc_set.all%}中执行'{image for user.userprofile.imagedoc_set.all%}'。 –

+0

@Daniel Roseman,绝对真相。我不注意。 – chem1st

相关问题