广告区
广告区
关注本站官方公众号:程序员总部,领取三大福利!
福利一:python和前端辅导
福利二:进程序员交流微信群,专属于程序员的圈子
福利三:领取全套零基础视频教程(python,java,前端,php)
发布于2022-05-21 12:13 阅读(293) 评论(0) 点赞(30) 收藏(2)
我有一个简单的个人资料表格,显示用户个人资料并允许他们更新全名、姓名缩写、用户名和简历。在我的个人资料模型中,我将用户名设置为具有字段验证的唯一性。它更像是一个屏幕名称参考字段,因为电子邮件用于登录,但它仍然需要是唯一的,并且用户可以在需要时更改此名称。
问题是验证没有通过 form.is_valid(),即使用户没有更改他们的用户名,而是更新其他字段,因为请求用户的用户名已经存在。我该如何解决这个问题。
我正在尝试做的示例:
If username == form['username'].value() (meaning username is unchanged)
allow form.save()
else if form.is_valid(): (perform normal validation checks)
form.save()
感谢您的任何建议。
轮廓模型
class Profile(models.Model):
# OneToOneField ensures that only one user can have one profile
my_user = models.OneToOneField(MyUser, on_delete=models.CASCADE)
# Extension of additional user information
full_name = models.CharField(max_length=255, blank=False, null=True)
initials = models.CharField(max_length=3, blank=False, null=True)
username_validator = UnicodeUsernameValidator()
username = models.CharField(verbose_name='username', max_length=30, unique=True, blank=False, null=True,
help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.',
validators=[username_validator],
error_messages={
'unique': "Username already exists.",
},
)
bio = models.TextField(null=True, blank=True)
avatar = models.ImageField(null=True, blank=True)
形式
class ProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ('full_name', 'initials', 'username', 'bio')
widgets = {
'full_name': forms.TextInput(attrs={'class': 'form-control mb-3', 'id':'full_name', 'placeholder': 'Full Name'}),
'initials': forms.TextInput(attrs={'class': 'form-control mb-3', 'id':'initials', 'maxlength': '3', 'placeholder': 'Initials'}),
'username': forms.TextInput(attrs={'class': 'form-control mb-3', 'id':'username', 'placeholder': 'Username'}),
'bio': forms.Textarea(attrs={'rows':5, 'cols':8}),
}
查看帖子功能
def post(self, request, *args, **kwargs):
form = ProfileForm(request.POST or None)
email = self.request.user
my_user = Profile.objects.get(my_user=email)
if my_user.username == form['username'].value():
#need to override username validation on field for current user
pass
else:
if form.is_valid():
# Update Profile Information
my_user.full_name = form.cleaned_data['full_name']
my_user.initials = form.cleaned_data['initials']
my_user.username = form.cleaned_data['username']
my_user.bio = form.cleaned_data['bio']
my_user.save()
# Send Success Message To User
messages.success(request, 'Profile has been updated.')
# Update Session Variables
request.session['full_name'] = my_user.full_name
request.session['initials'] = my_user.initials
request.session['username'] = my_user.username
context = {'form': form}
return render(request, 'profile.html', context)
模板
{% extends 'account/base.html' %}
{% load crispy_forms_tags %}
{% block head_title %}Manage Profile{% endblock %}
{% block base_content %}
<h6 class="text-center">Manage Account Profile</h6>
<hr>
<div class="py-3">
<form id="profile_form" method="POST" action="{% url 'account_profile' %}" class="col-sm-8 mx-auto small">
{% csrf_token %}
{{ form|crispy }}
<button class="btn btn-primary btn-block" type="submit">Update Profile</button>
</form>
</div>
{% endblock %}
由于您以任何方式使用模型表单,如果您想更新该配置文件,您可以将配置文件实例传递给您的表单。试试这个。
def post(self, request, *args, **kwargs):
obj = Profile.objects.get(my_user = request.user)
form = ProfileForm(request.POST, instance = obj)
if form.is_valid():
form.save()
messages.success(request, 'Profile has been updated.')
context = {'form': form}
return render(request, 'profile.html', context)
关注本站官方公众号:程序员总部,领取三大福利!
福利一:python和前端辅导
福利二:进程序员交流微信群,专属于程序员的圈子
福利三:领取全套零基础视频教程(python,java,前端,php)
关注公众号回复python,免费领取 全套python视频,回复充值+你的账号,免费为您充值1000积分
作者:黑洞官方问答小能手
链接:https://www.pythonheidong.com/blog/article/1533940/33f9075e2c0e4186656c/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!