已注册的用户名可以在用户创建表单中注册。我正在制作Django应用程序。 我在views.py中写道
def regist(request):
regist_form = RegisterForm(request.POST or None)
context = {
'regist_form': regist_form,
}
return render(request, 'registration/regist.html', context)
def regist_save(request):
regist_form = RegisterForm(request.POST or None)
if request.method == "POST" and regist_form.is_valid():
regist = regist_form.save(commit=False)
regist.is_staff = True
regist.save()
advertisements = Advertisement.objects.all()
return render(request, 'registration/detail.html', {'advertisements': advertisements})
在regist.html中
<form class="form-horizontal" action="/accounts/regist_save/" method="POST">
<div class="form-group-lg">
<label for="id_username">Username</label>
{{ regist_form.username }}
<p class="help-block">{{ regist_form.username.help_text }}</p>
</div>
<div class="form-group-lg">
<label for="id_email">Email</label>
{{ regist_form.email }}
<p class="help-block">{{ regist_form.email.help_text }}</p>
</div>
<div class="form-group-lg">
<label for="id_password">Password</label>
{{ regist_form.password1 }}
<p class="help-block">{{ regist_form.password1.help_text }}</p>
</div>
<div class="form-group-lg">
<label for="id_password">Password(Confirmation)</label>
{{ regist_form.password2 }}
<p class="help-block">{{ regist_form.password2.help_text }}</p>
</div>
<div class="form-group-lg">
<div class="col-xs-offset-2">
<button type="submit" class="btn-lg regist">Register</button>
<input name="next" type="hidden" />
</div>
</div>
{% csrf_token %}
</form>
在forms.py
中class RegisterForm(UserCreationForm):
class Meta:
model = User
fields = ('username', 'email','password1','password1',)
def __init__(self, *args, **kwargs):
super(RegisterForm, self).__init__(*args, **kwargs)
self.fields['username'].widget.attrs['class'] = 'form-control'
self.fields['email'].widget.attrs['class'] = 'form-control'
self.fields['password1'].widget.attrs['class'] = 'form-control'
self.fields['password2'].widget.attrs['class'] = 'form-control'
现在在此用户注册表单中,如果我已经注册了已注册的用户名和电子邮件和密码,则这些数据未注册,但detail.html已加载。如果我这样做,我想要显示警告,例如“此用户名已经注册”。为什么我的网页不是我理想的网页?为什么我可以抵制我网站上已注册的用户名?我该怎么解决这个问题?我没有在models.py中创建用户模型。
答案 0 :(得分:2)
from django.contrib.auth.models import User
from django.contrib import messages
from django.db.models import Q
if request.method == "POST" and regist_form.is_valid():
try:
username = form.cleaned_data.get('username', None)
email = form.cleaned_data.get('email', None)
# if username or email already exist in the User table
# if you want to use the user object you can make it
# if you want to check username and email with or, then it would work
user = User.objects.get(Q(username=username) | Q(email=email))
# if you want to check username and email with and, then it would work
user = User.objects.get(username=username, email=email)
# else if you have no username but only email you just only filter for email
user = User.objects.get(email=email)
# else if no need for user detail, you can do this
User.objects.get(Q(username=username) | Q(email=email))
messages.warning(request, 'That detailed use is already available.')
# return to register form / template page
# whatever your page is
except User.DoesNotExist:
# save the user
regist = regist_form.save(commit=False)
regist.is_staff = True
regist.save()
答案 1 :(得分:0)
我建议使用自定义模型并扩展身份验证。默认情况下,如果unique设置为true,则django fill会在提交期间引发表单错误。
在models.py
中class User(AbstractUser):
"""User model."""
username = models.CharField(max_length=128, unique=True)
email = models.EmailField(_('email address'), unique=True)
def __str__(self):
return self.username
PS:覆盖任何需要的地方。还建议查看django教程和simpleisbetterthancomplex。 Vitor先生有一个简单的教程