首页 > 解决方案 > 配置文件的 href 属性在创建 Django 时显示空字符串

问题描述

创建新用户后,会创建用户个人资料,但不显示默认图像。当我检查查看页面源时,src 属性显示空字符串,如src=''. 但是,当我转到可以更新我的个人资料的个人资料链接时,它会自动加载默认图像,并且该用户创建的所有帖子都将获得该默认图像。

新用户创建和用户添加的新帖子

新用户创建和用户添加的新帖子

当我单击用户配置文件时,它会自动加载默认图像

当我单击用户个人资料时

并且该用户创建的所有帖子都会获得默认图像。 在此处输入图像描述

查看页面源代码 在此处输入图像描述

mdoels.py

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

    def __str__(self):
        return f'{self.user.username} Profile'

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        img = Image.open(self.image.path)
        if img.height > 300 or img.width > 300:
            output_size = (300, 300)
            img.thumbnail(output_size)
            img.save(self.image.path)

forms.py

class UserRegistrationForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

class UserUpdateForm(forms.ModelForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email']

class ProfileUpdateForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['image']

view.py

@login_required
def profile(request):
    Profile.objects.get_or_create(user=request.user)
    if request.method == 'POST':
        u_form = UserUpdateForm(data=request.POST, instance=request.user)
        p_form = ProfileUpdateForm(data=request.POST, instance=request.user.profile, files=request.FILES)
        if u_form.is_valid() and p_form.is_valid():
            u_form.save()
            p_form.save()
            messages.success(request, f'Your account has been updated!')
            return redirect('profile')
    else:
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileUpdateForm(instance=request.user.profile)

    context = {
        'u_form':u_form,
        'p_form':p_form
    }
    return render(request, 'users/profile.html', context)

signals.py

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

from .models import Profile

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)


@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
    instance.profile.save()

是因为个人资料视图中的信号或线路 Profile.objects.get_or_create(user=request.user) 吗?在此之前我有一个错误:RelatedObjectDoesNotExist. User has no profile。我使用 Profile.objects.get_or_create(user=request.user) 解决了。

编辑:添加了配置文件模板 profile.html

{% extends "blog/base.html" %}
{% load crispy_forms_tags %}

{% block title %}
  {{ user }}'s' Profile
{% endblock title %}

{% block content %}
  <div class="content-section">
    <div class="media">
      <img src="{{ user.profile.image.url }}" alt="" class="rounded-circle account-img">
      <div class="media-body">
        <h2 class="account-heading"> {{ user.username }} </h2>
        <p class="text-secondary">{{ user.email }}</p>
      </div>
    </div>
    <form action="" method="post" enctype="multipart/form-data">
      {% csrf_token %}
      <fieldset class="form-group">
        <legend class="border-bottom mb-4">Profile Info</legend>
        {{ u_form|crispy }}
        {{ p_form|crispy }}
      </fieldset>
      <div class="form-group">
        <button class="btn btn-outline-info" type="submit">Update</button>
      </div>
    </form>
  </div>
{% endblock content %}

标签: pythondjangodjango-viewssignals

解决方案


我不知道你的 django 版本,所以你必须检查你拥有的那个。我将在 Django 2.2 上开发一个示例,因为这是我使用的,但是您可以通过遵循django 文档中为您的版本添加的内容来进行调整。

基本上你需要staticfiles在模板上加载标签,然后在你需要添加的表单上form.media

因此,您可以尝试在模板上添加以下内容:( # this line added)

{% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% load staticfiles %}  # this line added


{% block title %}
  {{ user }}'s' Profile
{% endblock title %}

{% block content %}
  <div class="content-section">
    <div class="media">
      <img src="{{ user.profile.image.url }}" alt="" class="rounded-circle account-img">
      <div class="media-body">
        <h2 class="account-heading"> {{ user.username }} </h2>
        <p class="text-secondary">{{ user.email }}</p>
      </div>
    </div>
    <form action="" method="post" enctype="multipart/form-data">
      {% csrf_token %}
      {{ form.media }}  # this line added
      <fieldset class="form-group">
        <legend class="border-bottom mb-4">Profile Info</legend>
        {{ u_form|crispy }}
        {{ p_form|crispy }}
      </fieldset>
      <div class="form-group">
        <button class="btn btn-outline-info" type="submit">Update</button>
      </div>
    </form>
  </div>
{% endblock content %}

我很久以前遇到过同样的问题,这就是为我解决的问题。希望对你有效。


推荐阅读