python - 我怎样才能让用户改变他自己的形象不仅仅是从管理员
问题描述
我正在尝试找到一种方法让用户更改自己的图像,但我做不到,因为我是 Django 新手,如果您能以与我的代码流相同的方式帮助我,请不要不要感到困惑,或者如果你能解释一下谢谢,Forms.py
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from accounts.models import UserProfile
class RegistrationForm(UserCreationForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = (
'username',
'first_name',
'last_name',
'email',
'password1',
'password2'
)
def save(self, commit=True):
user = super(RegistrationForm, self).save(commit=False)
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.email = self.cleaned_data['email']
if commit:
user.save()
return user
class EditProfileForm(UserChangeForm):
template_name='/something/else'
class Meta:
model = User
fields = (
'email',
'first_name',
'last_name',
)
模型.py
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
class UserProfileManager(models.Manager):
def get_queryset(self):
return super(UserProfileManager, self).get_queryset().filter(city='London')
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
description = models.CharField(max_length=100, default='')
city = models.CharField(max_length=100, default='')
website = models.URLField(default='')
phone = models.IntegerField(default=0)
image = models.ImageField(upload_to='image/', blank=True)
objects = models.Manager()
london = UserProfileManager()
def __str__(self):
return self.user.username
def create_profile(sender, **kwargs):
if kwargs['created']:
user_profile = UserProfile.objects.create(user=kwargs['instance'])
post_save.connect(create_profile, sender=User)
个人资料.Html
{% extends 'base.html' %}
{% load static %}
{% block head %}
<title>Profile</title>
{% endblock %}
{% block content %}
<div class="container">
<br><br>
<div class="row">
<br><br>
<div class="col-4">
{% if user.userprofile.image %}
<img class="UserImage" src="{{ user.userprofile.image.url }}" height="240" width="240">
{% else %}
<img class="UserImage image" src="{% static 'defaultui.jpg' %}" height="240" width="240">
{% endif %}
</div>
<div class="col-4">
<h1>Profile</h1>
<p><b>Username:</b> {{ user }}</p>
<p><b>First name:</b> {{ user.first_name }}</p>
<p><b>Last name:</b> {{ user.last_name }}</p>
<p><b>Email:</b> {{ user.email }}</p>
<p><b>Description:</b>Description: {{ user.userprofile.description }}</p>
<p><b>Phone:</b> {{ user.userprofile.phone }}</p>
<p><b>City:</b> {{ user.userprofile.city }}</p>
<p><b>Website:</b> {{ user.userprofile.website }}</p>
</div>
</div>
<h1>Your Posts</h1>
</div>
{% endblock %}
编辑 profile.html
{% extends 'base.html' %}
{% block content %}
<div class="container">
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<a href="{% url 'change_password' %}"><button type="button" class="btn btn-success" name="button">Change Password</button></a>
<button class="btn btn-primary" type="submit">Submit</button>
</form>
<br>
</div>
{% endblock %}
视图.py
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.models import User
from django.contrib import auth
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import UserChangeForm, PasswordChangeForm
from django.contrib.auth import update_session_auth_hash
from django.urls import reverse
from accounts.forms import (
RegistrationForm,
EditProfileForm
)
from products.models import Product
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserChangeForm, PasswordChangeForm
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.decorators import login_required
def register(request):
if request.method =='POST':
form = RegistrationForm(request.POST)
if form.is_valid():
form.save()
return redirect('home')
else:
form = RegistrationForm()
args = {'form': form}
return render(request, 'accounts/reg_form.html', args)
def view_profile( request, pk=None):
product = Product()
if pk:
user = User.objects.get(pk=pk)
else:
user = request.user
args = {'user': user, 'product':product}
return render(request, 'accounts/profile.html', args)
def edit_profile(request):
if request.method == 'POST':
form = EditProfileForm(request.POST, instance=request.user)
if form.is_valid():
form.save()
return redirect('view_profile')
else:
form = EditProfileForm(instance=request.user)
args = {'form': form}
return render(request, 'accounts/edit_profile.html', args)
def change_password(request):
if request.method == 'POST':
form = PasswordChangeForm(data=request.POST, user=request.user)
if form.is_valid():
form.save()
update_session_auth_hash(request, form.user)
return redirect('view_profile')
else:
return redirect('change_password')
else:
form = PasswordChangeForm(user=request.user)
args = {'form': form}
return render(request, 'accounts/change_password.html', args)
def login(request):
if request.method == 'POST':
user = auth.authenticate(username=request.POST['username'],password=request.POST['password'])
if user is not None:
auth.login(request, user)
return redirect('home')
else:
return render(request, 'accounts/login.html',{'error':'username or password is incorrect.','user':user})
else:
return render(request, 'accounts/login.html')
def logout(request):
if request.method == 'POST':
auth.logout(request)
return redirect('home')
解决方案
尝试使用 ModelForm 作为表单并使用 UserProfile 来更改图像,而不是 User。类似于:
class UserChangeProfileForm(ModelForm):
class Meta:
model = UserProfile
fields = ['image']
此外,检查并使用清晰的表单,而不是手动声明它们。
推荐阅读
- java - MaterialButton 与 Button 的大小差异
- java - 在两台不同的机器上创建 RMI 应用程序时客户端和服务器我们应该在哪里定义我们的接口客户端或服务器端?
- featuretools - 您如何搜索特定功能?
- vagrant - vagrant ssh-config 非常慢
- r - R 字符到日期时间导致 NA
- angular - Angular 7注入服务未设置
- ios - IQKeyboardManagerSwift“共享”不可用:在适当的情况下使用基于视图控制器的解决方案
- r - 在 R 的逻辑回归中使用权重的正确方法是什么?
- shell - 将转录本 ID 和基因符号从 rna fasta 打印到新的文本文件
- php - 如果 in_array 未找到,则使用 else 语句