gpt4 book ai didi

Django 注册 - 需要一种简单的方法将用户名默认为随机生成的字符串

转载 作者:行者123 更新时间:2023-12-01 12:45:15 30 4
gpt4 key购买 nike

我正在使用 Django 注册。它提供了处理 registration_form.html 的 View ,该 html 当前包含用户名、密码 1、密码 2 和电子邮件作为我的应用程序中的用户可输入字段。我有一个非常简单的随机用户名生成器,我想用它在 registration_form.html 中预填充用户名并将其设置为“只读”。我很难弄清楚应该在 Django Registration 中的哪个位置进行调整。我相信它就在这里的某个地方:

class RegistrationView(_RequestPassingFormView):
"""
Base class for user registration views.

"""
disallowed_url = 'registration_disallowed'
form_class = RegistrationForm
http_method_names = ['get', 'post', 'head', 'options', 'trace']
success_url = None
template_name = 'registration/registration_form.html'

def dispatch(self, request, *args, **kwargs):
"""
Check that user signup is allowed before even bothering to
dispatch or do other processing.

"""
if not self.registration_allowed(request):
return redirect(self.disallowed_url)
return super(RegistrationView, self).dispatch(request, *args, **kwargs)

def form_valid(self, request, form):
new_user = self.register(request, **form.cleaned_data)
success_url = self.get_success_url(request, new_user)

# success_url may be a simple string, or a tuple providing the
# full argument set for redirect(). Attempting to unpack it
# tells us which one it is.
try:
to, args, kwargs = success_url
return redirect(to, *args, **kwargs)
except ValueError:
return redirect(success_url)

def registration_allowed(self, request):
"""
Override this to enable/disable user registration, either
globally or on a per-request basis.

"""
return True

def register(self, request, **cleaned_data):
"""
Implement user-registration logic here. Access to both the
request and the full cleaned_data of the registration form is
available here.

"""
raise NotImplementedError

更新:

因此,根据最初的响应,我开始对现有的 RegistrationView 进行快速编辑,如下所示:

class RegistrationForm(forms.Form):
required_css_class = 'required'

# username = forms.RegexField(regex=r'^[\w.@+-]+$',
# max_length=30,
# label=_("Username"),
# error_messages={'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")})
# My new username stuff here:
n = random.randint(1,9999999)
default_username = 'AnonMom%d' % (n,)
username = forms.CharField(initial="default_username")
email = forms.EmailField(label=_("E-mail"))
password1 = forms.CharField(widget=forms.PasswordInput,
label=_("Password"))
password2 = forms.CharField(widget=forms.PasswordInput,
label=_("Password (again)"))

我期待看到我的默认用户名显示在 registration.form.html 中,定义如下:

<form method="post" action=".">{% csrf_token %}

<p><input id="id_username" maxlength="25" name="username" type="text" autocomplete="off"></p>
<p style="font-size:12px; color:#999">Make it anonymous but easy to remember. 25 chars max. No spaces.</p>
<p><input id="id_password1" name="password1" type="password" placeholder="Password"/></p>
<p><input id="id_password2" name="password2" type="password" placeholder="Password (Confirm)"/></p>
<p><input id="id_email" name="email" type="email" placeholder="Email (Never displayed)" autocomplete="off"/></p>

但是该字段是空的。如果我只设置 initial="xxx",它甚至是空的。我做错了什么?

更新 2:

使用上面的代码以及以下对 View 和表单的轻微柚木,所有这些都可以正常工作:

class RegistrationForm(forms.Form):                           
n = random.randint(1,9999999)
username = forms.CharField(initial='MomzAnon%d' % (n,) )
...

<form method="post" action=".">{% csrf_token %}
<p><input id="id_username" maxlength="25" name="username" type="text"
value="{{ form.username.value }}" readonly autocomplete="off"></p>
...

最后一个问题:是否有任何理由将 RegistrationForm 子类化而不是仅仅编辑它?就代码行而言,我的方法似乎非常简单。

更新 3:似乎我每次调用此表单时都不会自动生成我的随机用户名。所以我回到这个创建了一个用户的表单,发现自动生成的用户名与上次用户注册没有变化。每次向用户显示此表单时,如何强制重新生成用户名?

更新 4:我通过将用户名逻辑移至此处解决了更新 3 中概述的问题。此代码还包括一个调整,以确保我随机生成的用户名也是唯一的:

def __init__(self, *args, **kwargs):
super(RegistrationForm, self).__init__(*args, **kwargs)

n = random.randint(1,999999)
new_username = 'anon%d' % (n,)

while User.objects.filter(username=new_username).exists():
n = random.randint(1,999999)
new_username = 'anon%d' % (n,)

self.fields['username'] = forms.CharField(initial=new_username)

最佳答案

您可以继承 RegistrationForm 并通过添加 readonly 小部件属性将用户名字段设置为只读:

from registration.forms import RegistrationForm

class MyForm(RegistrationForm):
username = forms.CharField(max_length=30, label=_("Username"),
widget=forms.TextInput(attrs={'readonly':'readonly'}))

在您的 RegistrationView 子类中,将 form_class 更改为您的表单类并覆盖 get_initial 函数(您的生成随 secret 码代码可以放在此处) :

class MyReg(RegistrationView):
form_class = MyForm

def get_initial(self, *args, **kwargs):
self.initial = {'username': self.gen_randrom_username()}
return super(Myreg, self).get_initial(*args, **kwargs)

def gen_randrom_username(self):
# gen name
return random_username

关于Django 注册 - 需要一种简单的方法将用户名默认为随机生成的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20734095/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com