提交注册表后如何为所有新用户上传默认图像
How can i upload Default Image for all new user when the registration form is submitted
无论如何我可以为他们的个人资料中的所有新用户上传图片。我创建了一个用户注册页面,因此当用户提交表单时,将使用 Django Signals 自动创建新配置文件,我现在面临的问题是:创建新用户并将用户重定向到主页时,当用户点击个人资料页面个人资料页面抛出这样的错误:
ValueError at /profile/15/
The 'profile_image' attribute has no file associated with it.
它突出显示了页面中的这段 html 代码:
<img class="card-img-top" src="{{profile.profile_image.url}}" alt="Card image cap">
我是否可以为所有新用户在他们的个人资料中上传图片,以避免模板中出现错误消息。就像我如何为所有新用户制作自动配置文件一样。
我的模特:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
profile_image = models.ImageField(upload_to='avatar', blank=True, null=True)
stories = RichTextField(blank=True, null=True)
twitter = models.URLField(max_length=300, blank=True, null=True)
website = models.URLField(max_length=300,blank=True, null=True)
city = models.CharField(max_length=50, blank=True, null=True)
location = models.CharField(max_length=80, blank=True, null=True)
slug = models.SlugField(unique=True, max_length=200)
def save(self, *args, **kwargs):
self.slug = slugify(self.user)
super(Profile, self).save(*args, **kwargs)
def __str__(self):
return str(self.user)
signals.py 文件:
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from . models import Profile
User = settings.AUTH_USER_MODEL
#this function wake up after a User object save
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
个人资料模板:
<div class="container">
{% for profile in profiles %}
<div class="row justify-content-center">
<div class="card" style="width: 18rem;">
<img class="card-img-top" src="{{profile.profile_image.url}}" alt="Card image cap">
<div class="card-body">
<a href="{% url 'edit' profile.slug %}">Edit</a>
<a href="{{profile.website}}">My website</a>
<a href="{{profile.twitter}}">My twitter</a>
<p>{{profile.city}}</p>
<p>{{profile.location}}</p>
<p>{{profile.stories}}</p>
</div>
</div>
</div>
{% endfor %}
</div>
我的观点:
def profile(request, pk):
profiles = Profile.objects.filter(user=request.user)
questions = Question.objects.filter(user=request.user)
context = {
'profiles':profiles,
'questions':questions
}
return render(request, 'profile.html', context)
def register(request):
if request.method == 'POST':
username = request.POST['username']
first_name = request.POST['first_name']
last_name = request.POST['last_name']
email = request.POST['email']
password = request.POST['password']
password2 = request.POST['password2']
if password == password2:
if User.objects.filter(email=email).exists():
messages.info(request, 'Email or user name Already taking')
return redirect('register')
elif User.objects.filter(username=username).exists():
messages.info(request, 'username is taken')
return redirect('register')
else:
user = User.objects.create_user(username=username, first_name=first_name,
last_name=last_name, email=email, password=password)
user.save();
return redirect('login')
else:
messages.info(request, 'Password Not Match')
return redirect('register')
return redirect ('/')
else:
return render(request, 'signup.html')
将模型 ImageField 中的默认值设置为静态部分中的图像文件
profile_image = models.ImageField(upload_to='avatar', blank=True, null=True, default='path/to/static/default_user_image.jpg')
迁移数据库会将其添加到任何空的用户图像字段中,您可以通过上传另一个同名图像文件来更新它。这也将防止同一文件的多个副本。
你可以采用这种方法。
在 media folder
中,您可以添加名为 default.png
或 default.jpg
的图像。
现在在您的 models.py
文件中,您可以:
class Profile(models.Model):
...
# setting the default image from here if none was uploaded when creating the profile
# passing the name of the image to the default attribute
profile_image = models.ImageField(upload_to='avatar', blank=True, null=True, default='default.jpg')
...
此外,您可以检查(来自模板) 以查看给定的个人资料是否有图像:
{% if profile.profile_image %}
<img class="card-img-top" src="{{ profile.profile_image.url }}" alt="Card image cap">
{% endif %}
我建议将以上两项添加到您所拥有的内容中。
无论如何我可以为他们的个人资料中的所有新用户上传图片。我创建了一个用户注册页面,因此当用户提交表单时,将使用 Django Signals 自动创建新配置文件,我现在面临的问题是:创建新用户并将用户重定向到主页时,当用户点击个人资料页面个人资料页面抛出这样的错误:
ValueError at /profile/15/
The 'profile_image' attribute has no file associated with it.
它突出显示了页面中的这段 html 代码:
<img class="card-img-top" src="{{profile.profile_image.url}}" alt="Card image cap">
我是否可以为所有新用户在他们的个人资料中上传图片,以避免模板中出现错误消息。就像我如何为所有新用户制作自动配置文件一样。
我的模特:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
profile_image = models.ImageField(upload_to='avatar', blank=True, null=True)
stories = RichTextField(blank=True, null=True)
twitter = models.URLField(max_length=300, blank=True, null=True)
website = models.URLField(max_length=300,blank=True, null=True)
city = models.CharField(max_length=50, blank=True, null=True)
location = models.CharField(max_length=80, blank=True, null=True)
slug = models.SlugField(unique=True, max_length=200)
def save(self, *args, **kwargs):
self.slug = slugify(self.user)
super(Profile, self).save(*args, **kwargs)
def __str__(self):
return str(self.user)
signals.py 文件:
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from . models import Profile
User = settings.AUTH_USER_MODEL
#this function wake up after a User object save
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
个人资料模板:
<div class="container">
{% for profile in profiles %}
<div class="row justify-content-center">
<div class="card" style="width: 18rem;">
<img class="card-img-top" src="{{profile.profile_image.url}}" alt="Card image cap">
<div class="card-body">
<a href="{% url 'edit' profile.slug %}">Edit</a>
<a href="{{profile.website}}">My website</a>
<a href="{{profile.twitter}}">My twitter</a>
<p>{{profile.city}}</p>
<p>{{profile.location}}</p>
<p>{{profile.stories}}</p>
</div>
</div>
</div>
{% endfor %}
</div>
我的观点:
def profile(request, pk):
profiles = Profile.objects.filter(user=request.user)
questions = Question.objects.filter(user=request.user)
context = {
'profiles':profiles,
'questions':questions
}
return render(request, 'profile.html', context)
def register(request):
if request.method == 'POST':
username = request.POST['username']
first_name = request.POST['first_name']
last_name = request.POST['last_name']
email = request.POST['email']
password = request.POST['password']
password2 = request.POST['password2']
if password == password2:
if User.objects.filter(email=email).exists():
messages.info(request, 'Email or user name Already taking')
return redirect('register')
elif User.objects.filter(username=username).exists():
messages.info(request, 'username is taken')
return redirect('register')
else:
user = User.objects.create_user(username=username, first_name=first_name,
last_name=last_name, email=email, password=password)
user.save();
return redirect('login')
else:
messages.info(request, 'Password Not Match')
return redirect('register')
return redirect ('/')
else:
return render(request, 'signup.html')
将模型 ImageField 中的默认值设置为静态部分中的图像文件
profile_image = models.ImageField(upload_to='avatar', blank=True, null=True, default='path/to/static/default_user_image.jpg')
迁移数据库会将其添加到任何空的用户图像字段中,您可以通过上传另一个同名图像文件来更新它。这也将防止同一文件的多个副本。
你可以采用这种方法。
在 media folder
中,您可以添加名为 default.png
或 default.jpg
的图像。
现在在您的 models.py
文件中,您可以:
class Profile(models.Model):
...
# setting the default image from here if none was uploaded when creating the profile
# passing the name of the image to the default attribute
profile_image = models.ImageField(upload_to='avatar', blank=True, null=True, default='default.jpg')
...
此外,您可以检查(来自模板) 以查看给定的个人资料是否有图像:
{% if profile.profile_image %}
<img class="card-img-top" src="{{ profile.profile_image.url }}" alt="Card image cap">
{% endif %}
我建议将以上两项添加到您所拥有的内容中。