【问题标题】:Clean django user.username清理 django user.username
【发布时间】:2012-03-23 23:18:35
【问题描述】:

我有一个用户表单,其中有一个用户名字段。表单中的字段是从 db 中的数据初始化的。

class PersonEditForm(forms.ModelForm):

    username = forms.RegexField(label=_("Username"), max_length=30, regex=r'^[\w.@+-]+$',
    help_text = _("Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only."),
    error_messages = {'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")})


class Meta:
    model = User

view.py

@login_required
def edit(request, template_name):

    if request.user.is_authenticated():
        if request.method == 'POST':
            form = PersonEditForm(request.POST)
            if form.is_valid():
                form.save(instance = request.POST, user = request.user)
                return HttpResponseRedirect(reverse('/success/'))

        else:
            user = User.objects.get(username = request.user)
            form = PersonEditForm(instance = user, initial = {'username': request.user.username})

            return render_to_response(template_name, {"form": form },
                              context_instance = RequestContext(request))

登录的用户可以编辑用户名。问题是在编写 clean_username 方法时,我需要 request.user 来检查:

  1. 如果用户名 == request.user.username #return true
  2. elif 用户名 != request.user.username

    a) User.objects.get(username = username) #if 返回一些东西然后引发 forms.ValidationError(_("Username already taken."))

    b) 否则 user.username = 用户名

我怎样才能做到这一点?

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    您可以在self.instance获取它

    class PersonEditForm(forms.ModelForm):
        def clean_username(self):
            # self.instance is your current user
    
        ...
    

    视图应该是这样的

    if request.user.is_authenticated():
        if request.method == 'POST':
            form = PersonEditForm(request.POST, instance=request.user)
            if form.is_valid():
                form.save()
                return HttpResponseRedirect(reverse('/success/'))
    
        else:
            form = PersonEditForm(instance=request.user, initial={'username': request.user.username})
    
        return render_to_response(template_name, {"form": form },
                              context_instance = RequestContext(request))
    

    【讨论】:

    • 我应该如何呈现表单?现在它说 form = PersonEditForm(instance = user, initial = {'username': request.user.username})
    • @mangobug 就像任何其他形式一样,我猜。这里没有任何东西会影响表单的外观。
    • 它在 self.current_user = kwargs.pop('current_user') 行给出 key error
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 2021-12-22
    相关资源
    最近更新 更多