如何从其他应用程序中的作者那里恢复个人资料图片?

时间:2019-03-02 21:39:24

标签: python django

我现在正在创建博客文章,并且是Django的新手。我在另一个应用程序(注册)中有头像图片,我正在尝试导入并正确关联到另一个应用程序(页面)。换句话说,我需要用HTML恢复创建帖子的用户的确切头像图片。谢谢!

models.py(注册)

from django.db import models
from django.contrib.auth.models import User
from django.dispatch import receiver 
from django.db.models.signals import post_save


def custom_upload_to(instance, filename):
    old_instance = Profile.objects.get(pk=instance.pk)
    old_instance.avatar.delete()
    return 'profiles/' + filename

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    avatar = models.ImageField(upload_to=custom_upload_to, null=True, blank=True)
    bio = models.TextField(null=True, blank=True)
    link = models.URLField(max_length=200, null=True, blank=True)

    class Meta:
        ordering = ['user__username']

@receiver(post_save, sender=User)
def ensure_profile_exists(sender, instance, **kwargs):
    if kwargs.get('created', False):
        Profile.objects.get_or_create(user=instance)

models.py(页面)

from django.db import models
from ckeditor.fields import RichTextField
from django.contrib.auth.models import User
from registration.models import Profile

class Page(models.Model):
    title = models.CharField(verbose_name="Título", max_length=200)                             # Titulo 
    author = models.ForeignKey('auth.User', verbose_name="autor", on_delete=models.CASCADE, null = True)
    content = RichTextField(verbose_name="Contenido")                                           # Contenido 
    order = models.SmallIntegerField(verbose_name="Orden", default=0)                           # Orden de publicacion
    created = models.DateTimeField(auto_now_add=True, verbose_name="Fecha de creación")         # Fecha de creacion
    updated = models.DateTimeField(auto_now=True, verbose_name="Fecha de edición")              # Fecha de actualizacion


    class Meta:
        verbose_name = "página"
        verbose_name_plural = "páginas"
        ordering = ['order', 'title']

    def __str__(self):
        return self.title 

views.py(页面)

from .models import Page
from django.views.generic.list import ListView 
from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView
from django.views.generic.edit import UpdateView
from django.views.generic.edit import DeleteView
from django.urls import reverse, reverse_lazy
from .forms import PageForm
from django.shortcuts import redirect
from django.contrib.admin.views.decorators import staff_member_required
from registration.models import Profile

#Decoradores
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required

# Create your views here.
class StaffRequiredMixin(object):
    @method_decorator(staff_member_required)
    def dispatch(self, request, *args, **kwargs):
        return super(StaffRequiredMixin, self).dispatch(request, *args, **kwargs)

@method_decorator(login_required, name="dispatch")
class PageListView(ListView):
    model = Page

@method_decorator(login_required, name="dispatch")
class PageDetailView(DetailView):
    model = Page

# CRUD: 
@method_decorator(staff_member_required, name='dispatch')
class PageCreate(CreateView):
    model = Page 
    form_class = PageForm
    success_url = reverse_lazy('pages:pages')

    def form_valid(self, form):
        self.post = form.save(commit=False)
        self.post.author =  self.request.user
        self.post.save()
        return super(PageCreate, self).form_valid(form)

@method_decorator(staff_member_required, name='dispatch')
class PageUpdate(UpdateView):
    model = Page
    form_class = PageForm
    template_name_suffix = '_update_form'

    def get_success_url(self):
        return reverse_lazy('pages:update', args=[self.object.id]) + '?ok'

@method_decorator(staff_member_required, name='dispatch')
class PageDelete(DeleteView):
    model = Page
    success_url = reverse_lazy('pages:pages')

1 个答案:

答案 0 :(得分:0)

您可能希望使用PageListView或PageDetailView中的get_context_data()提供数据。像这样:

class PageDetailView(DetailView):
    model = Page

   def get_context_data(**kwargs):
       context = super().get_context_data(**kwargs)

       # Profile image has a url property, so in the template {{ profile_image.url }}
       profile_image = self.object.author.user.profile.avatar
       context['profile_image'] = profile_image

       return context

注意:如果author.user.profile不存在,则会引发错误。您可以使用hasattr(author.user, "profile")测试关系。