在 Django 中扩展用户个人资料以包含个人资料照片
extend a user profile in django to include profile photo
我正在尝试在 django 中扩展用户个人资料,以便用户可以添加个人资料照片和生日日期,并且我正在使用 django-allauth 进行用户身份验证。我目前正在关注参考,但为了参考,使用了新的用户注册而不涉及 django-allauth。因此,我已经实现了这些代码,但有一点我无法弄清楚该特定代码行的放置位置
# Create the user profile
profile = Profile.objects.create(user=new_user)
下面是个人资料编辑代码
型号
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
date_of_birth = models.DateField(blank=True, null=True)
photo = models.ImageField(
upload_to= upload_location,
null = True,
blank = True,
height_field = "height_field",
width_field = "width_field")
def __str__(self):
return 'Profile for user {}'.format(self.user.username)
Form.py
class UserEditForm(forms.ModelForm):
username = forms.CharField(required=True)
email = forms.EmailField(required=True)
first_name = forms.CharField(required=False)
last_name = forms.CharField(required=False)
class Meta:
model = User
fields = ['first_name', 'last_name', 'username', 'email']
class ProfileEditForm(forms.ModelForm):
"""docstring for ProfileEditForm."""
class Meta:
model = Profile
fields = ['date_of_birth', 'photo']
查看
def edit(request):
if request.method == 'POST':
user_form = UserEditForm(instance = request.user, data = request.POST)
profile_form = ProfileEditForm(instance = request.user.profile, data = request.POST, files = request.FILES)
if user_form.is_valid() and profile_form.is_valid():
user_form.save()
profile_form.save()
else:
user_form = UserEditForm(instance= request.user)
profile_form = ProfileEditForm(instance=request.user.profile)
return render(request, 'account/edit.html',
{'user_form': user_form, 'profile_form': profile_form})
如果我尝试 运行 这样的代码,我会得到一个错误 User has no profile.
任何进一步的代码都会根据请求显示。
网址
url(r'^profile/edit/$', views.edit, name='update_profile'),
模板
<form method="POST" action="." class="" enctype="multipart/form-data"/>
{% csrf_token %}
{{ user_form.as_p }}
{{ profile_form.as_p }}
<input type="submit" name="submit" value="update">
</form>
在您看来,添加(或在别处添加,然后导入):
def load_profile(user):
try:
return user.profile
except: # this is not great, but trying to keep it simple
profile = Profile.objects.create(user=user)
return profile
然后将视图函数更改为使用 load_profile(request.user)
而不是 request.user.profile
。
查看
def edit(request):
profile = load_profile(request.user)
if request.method == 'POST':
user_form = UserEditForm(
instance=request.user,
data=request.POST,
)
profile_form = ProfileEditForm(
instance=profile,
data=request.POST,
files=request.FILES,
)
if user_form.is_valid() and profile_form.is_valid():
user_form.save()
profile_form.save()
else:
user_form = UserEditForm(instance=request.user)
profile_form = ProfileEditForm(instance=profile)
return render(
request,
'account/edit.html',
{'user_form': user_form, 'profile_form': profile_form}
)
由于您的错误提示用户个人资料不存在:
在你的 view
:
def edit(request):
if request.method == 'POST':
profile_form = ProfileEditForm(request.POST, request.FILES)
if profile_form.is_valid():
instance = profile_form.save(commit=False)
instance.user = request.user
instance.save()
return # add here
else:
profile_form = ProfileEditForm()
return render(request, 'account/edit.html', {'profile_form': profile_form})
它会起作用。
我正在尝试在 django 中扩展用户个人资料,以便用户可以添加个人资料照片和生日日期,并且我正在使用 django-allauth 进行用户身份验证。我目前正在关注参考,但为了参考,使用了新的用户注册而不涉及 django-allauth。因此,我已经实现了这些代码,但有一点我无法弄清楚该特定代码行的放置位置
# Create the user profile
profile = Profile.objects.create(user=new_user)
下面是个人资料编辑代码 型号
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
date_of_birth = models.DateField(blank=True, null=True)
photo = models.ImageField(
upload_to= upload_location,
null = True,
blank = True,
height_field = "height_field",
width_field = "width_field")
def __str__(self):
return 'Profile for user {}'.format(self.user.username)
Form.py
class UserEditForm(forms.ModelForm):
username = forms.CharField(required=True)
email = forms.EmailField(required=True)
first_name = forms.CharField(required=False)
last_name = forms.CharField(required=False)
class Meta:
model = User
fields = ['first_name', 'last_name', 'username', 'email']
class ProfileEditForm(forms.ModelForm):
"""docstring for ProfileEditForm."""
class Meta:
model = Profile
fields = ['date_of_birth', 'photo']
查看
def edit(request):
if request.method == 'POST':
user_form = UserEditForm(instance = request.user, data = request.POST)
profile_form = ProfileEditForm(instance = request.user.profile, data = request.POST, files = request.FILES)
if user_form.is_valid() and profile_form.is_valid():
user_form.save()
profile_form.save()
else:
user_form = UserEditForm(instance= request.user)
profile_form = ProfileEditForm(instance=request.user.profile)
return render(request, 'account/edit.html',
{'user_form': user_form, 'profile_form': profile_form})
如果我尝试 运行 这样的代码,我会得到一个错误 User has no profile.
任何进一步的代码都会根据请求显示。
网址
url(r'^profile/edit/$', views.edit, name='update_profile'),
模板
<form method="POST" action="." class="" enctype="multipart/form-data"/>
{% csrf_token %}
{{ user_form.as_p }}
{{ profile_form.as_p }}
<input type="submit" name="submit" value="update">
</form>
在您看来,添加(或在别处添加,然后导入):
def load_profile(user):
try:
return user.profile
except: # this is not great, but trying to keep it simple
profile = Profile.objects.create(user=user)
return profile
然后将视图函数更改为使用 load_profile(request.user)
而不是 request.user.profile
。
查看
def edit(request):
profile = load_profile(request.user)
if request.method == 'POST':
user_form = UserEditForm(
instance=request.user,
data=request.POST,
)
profile_form = ProfileEditForm(
instance=profile,
data=request.POST,
files=request.FILES,
)
if user_form.is_valid() and profile_form.is_valid():
user_form.save()
profile_form.save()
else:
user_form = UserEditForm(instance=request.user)
profile_form = ProfileEditForm(instance=profile)
return render(
request,
'account/edit.html',
{'user_form': user_form, 'profile_form': profile_form}
)
由于您的错误提示用户个人资料不存在:
在你的 view
:
def edit(request):
if request.method == 'POST':
profile_form = ProfileEditForm(request.POST, request.FILES)
if profile_form.is_valid():
instance = profile_form.save(commit=False)
instance.user = request.user
instance.save()
return # add here
else:
profile_form = ProfileEditForm()
return render(request, 'account/edit.html', {'profile_form': profile_form})
它会起作用。