python - 配置文件的 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 %}
解决方案
我不知道你的 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 %}
我很久以前遇到过同样的问题,这就是为我解决的问题。希望对你有效。
推荐阅读
- r - 在 macOS 上通过 R 连接到 SQL Server
- c++ - 当一个类在构造函数中动态分配自己时,为什么会发生堆栈溢出而不是 std::bad_alloc?
- javascript - 如果 Field 的类型是数字,Redux-form 的 Field 组件不会触发 normalize 功能
- vue.js - 如何在 vue-status-indicator 中动态更改道具?
- python - 检查在光线中完成了哪些 ObjectID
- javascript - 如何使用后端 bean 方法获取 CSS 类
- c# - 提交验证失败后未重新填充多选类别字段
- java - Java 需要巧妙地替换字符串中的部分字符串?
- matlab - 为什么我的线对象在应用程序设计器 Matlab 中被注册为双重对象?
- flutter - 在 ListView.builder 上显示来自 firestorage 的图像