Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从表单中获取用户名?_Python_Django_Forms - Fatal编程技术网

Python 如何从表单中获取用户名?

Python 如何从表单中获取用户名?,python,django,forms,Python,Django,Forms,我今天遇到了一个特殊的情况。以前我在view.py中有以下内容 def register_page(request): if request.method == 'POST': form = RegistrationForm(request.POST) if form.is_valid(): user = User.objects.create_user( username=form.cleaned_

我今天遇到了一个特殊的情况。以前我在view.py中有以下内容

def register_page(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = User.objects.create_user(
                username=form.cleaned_data['username'],
                password=form.cleaned_data['password2'],
                email=form.cleaned_data['email']
            )
            return HttpResponseRedirect('/register/success/')
    else:
        form = RegistrationForm()
    variables = RequestContext(request, {'form':form})
    return render_to_response('registration/register.html', variables)
在她注册后,检索用户名、电子邮件和密码来创建一个新用户非常简单。但现在我已经对它进行了重构,使用哈希代码作为用户名,并单独使用电子邮件进行注册和登录

缩短的注册表单如下所示:

class RegistrationForm(forms.ModelForm):
   email = forms.EmailField(label=_("Email"))
   password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
   password2 = forms.CharField(label=_("Password confirmation"), widget=forms.PasswordInput))

   class Meta:
        model = User
        fields = ("email",)

   def save(self, commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        email = self.cleaned_data['email']
        user.username = md5(email).digest().encode('base64')[:-1]
        if commit:
            user.save()
        return user
class cb_user_model_backend(ModelBackend):

    def create_user(self, email=None, password=None):
        """
        Creates and saves a User with the given email and password only.
        """
        now = timezone.now()
        username = md5(email).digest().encode('base64')[:-1]
        email = UserManager.normalize_email(email)
        user = self.model(username=username, email=email,
            is_staff=False, is_active=True, is_superuser=False,
            last_login=now, date_joined=now)

        user.set_password(password)
        user.save(using=self._db)
        return user
新表单不再具有用户名,因为它是经过计算的,不再由用户输入。但是如何从视图中检索用户名?新代码不是我写的,我在博客上看到的。也许钥匙在这里的元类?从文档中,我无法完全理解他试图通过这里的Meta类实现什么

非常感谢,

编辑

好的,我想我现在明白了子类应该如何工作了。我尝试将User类分为以下子类:

class RegistrationForm(forms.ModelForm):
   email = forms.EmailField(label=_("Email"))
   password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
   password2 = forms.CharField(label=_("Password confirmation"), widget=forms.PasswordInput))

   class Meta:
        model = User
        fields = ("email",)

   def save(self, commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        email = self.cleaned_data['email']
        user.username = md5(email).digest().encode('base64')[:-1]
        if commit:
            user.save()
        return user
class cb_user_model_backend(ModelBackend):

    def create_user(self, email=None, password=None):
        """
        Creates and saves a User with the given email and password only.
        """
        now = timezone.now()
        username = md5(email).digest().encode('base64')[:-1]
        email = UserManager.normalize_email(email)
        user = self.model(username=username, email=email,
            is_staff=False, is_active=True, is_superuser=False,
            last_login=now, date_joined=now)

        user.set_password(password)
        user.save(using=self._db)
        return user
我现在面临的问题是两个错误,self.\u db和self.model,它们应该位于基本用户类上。你从这里怎么去

编辑2:

PyCharm抱怨两个self._db和seld.model在当前cb_user_model_后端上不存在

请注意,该视图经过重构以采用两个参数:

user = User.objects.create_user(
                password=form.cleaned_data['password2'],
                email=form.cleaned_data['email']
            )
运行时,堆栈跟踪为:

Exception Type: TypeError
Exception Value:    
create_user() takes at least 2 arguments (3 given)

尝试在models.py中对save方法进行子类化:

def save(self, *args, **kwargs):
    if not self.id:
        self.username = md5(self.email).digest().encode('base64')[:-1]
    super(ModelName, self).save(*args, **kwargs)
调用user.save()后,user.username应在视图中生成用户名。希望这有帮助

编辑: 如果要调用create_user(**kwargs),可以在views.py中执行以下操作:

email = self.cleaned_data['email']
username = md5(email).digest().encode('base64')[:-1]
u = User.objects.create_user(username = username, email = email, password = password)

但是在创建用户对象user.objects.create_user(…)时,我仍然需要一个用户名作为参数传递,否?@Kave是的,您需要。您可以按照我对save子类化的方式将create_user子类化,以自动生成一个用户名,就像使用md5一样。或者你可以做我在编辑中发布的事情。是的,你是对的,我可以把它从表单重构到视图中。但我也尝试了子类的想法,并创建了一个,有两个小问题。请参见编辑。谢谢你发布完整的堆栈跟踪,@Kave?写一条评论,说明为什么有人会否决一个有效的问题,这是公平的。非常有建设性!