广告区

广告区


本站消息

站长简介/公众号

关注本站官方公众号:程序员总部,领取三大福利!
福利一:python和前端辅导
福利二:进程序员交流微信群,专属于程序员的圈子
福利三:领取全套零基础视频教程(python,java,前端,php)

  价值13000svip视频教程,python大神匠心打造,零基础python开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

如何在 Django 中覆盖用户名验证

发布于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)






所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/1533940/33f9075e2c0e4186656c/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

30 0
收藏该文
已收藏

评论内容:(最多支持255个字符)