我现在正在创建博客文章,并且是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')
答案 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")
测试关系。