理解Django

时间:2018-12-10 12:18:24

标签: python html django

我有一个连接到模型的用户个人资料页面,其中的其他字段包含以下内容:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')

那是应该的;加载与所讨论的用户相关的个人资料图片,并区分用户。 我现在想要做的是将一个单独的图库模型连接到个人资料页面,以便用户可以使用一个小的图库。 画廊模型如下:

class GalleryModel(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    img_1 = models.ImageField(default='default.jpg', upload_to='images')
    img_2 = models.ImageField(default='default.jpg', upload_to='images')
    img_3 = models.ImageField(default='default.jpg', upload_to='images')

views.py文件如下:

class ProfileDetailView(DetailView):
    model = Profile   # Is something iffy here? Should this refer to the GalleryModel as well?
    template_name = 'account/view_profile.html'

    def get_object(self):
        username = self.kwargs.get('username')
        if username is None:
            raise Http404
        return get_object_or_404(User, username__iexact=username, is_active=True)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        username = self.object.username
        context['person'] = GalleryModel.objects.get(user__username=username)   #loads username string
        context['img_1'] = GalleryModel.objects.last().img_1
        context['img_2'] = GalleryModel.objects.last().img_2
        context['img_3'] = GalleryModel.objects.last().img_3
        return context

我尝试了很多方法(例如filter()和get()方法的各种方法),仔细检查https://docs.djangoproject.com/en/2.1/topics/db/queries/并筛选在SO上可以找到的内容,但我无法解决

例如,filter(username__iexact = username)似乎并不能解决问题,对主题的变化也不会产生任何错误,但错误消息却是我所无法理解的。 如果在模板中插入{{person}},我可以获取用户名,但是如何在GalleryModel中获取连接到该用户名的对象(图像)?

尝试以下操作是不可能的:

GalleryModel.objects.get(user__username=username).img_1

和往常一样,我感到奇怪的是我缺少了一些简单的东西:)

注意!:很明显,我不知道last()方法是我应该做的,但是到目前为止,这是我设法将图像渲染到模板上的唯一方法。

1 个答案:

答案 0 :(得分:2)

如果要将图库连接到个人资料,则必须将个人资料添加为外键,而不是用户。

class GalleryModel(models.Model):
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE)

除非您还有其他图库,否则请使用Gallery(models.Model)。