问题
i am not very advanced user of Django. I have seen many different methods online, but they all are for modified models or too complicated for me to understand.
I am reusing the UserCreationForm
in my MyRegistrationForm
class MyRegistrationForm(UserCreationForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ('username', 'email', 'password1', 'password2')
def save(self, commit=True):
user = super(MyRegistrationForm, self).save(commit=False)
user.email = self.cleaned_data['email']
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
I struggle to understand or find a way to check if the username that user enters is already taken or not. So i just use this to redirect me to html where it says bad username or passwords do not match:
def register_user(request):
if request.method == 'POST':
form = MyRegistrationForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/accounts/register_success')
else:
return render_to_response('invalid_reg.html')
args = {}
args.update(csrf(request))
args['form'] = MyRegistrationForm()
print args
return render_to_response('register.html', args)
Here is my registration template(if needed):
{% extends "base.html" %}
{% block content %}
<section>
<h2 style="text-align: center">Register</h2>
<form action="/accounts/register/" method="post">{% csrf_token %}
<ul>
{{form.as_ul}}
</ul>
<input type="submit" value="Register" onclick="validateForm()"/>
</form>
</section>
{% endblock %}
But i need to rasise some kind of exception or smth like that before user gets redirected. Maybe when user presses register he/she would get the error/warrning saying that username is already taken? Is that possible?
回答1:
You can use exists:
from django.contrib.auth.models import User
if User.objects.filter(username=self.cleaned_data['username']).exists():
# Username exists
...
回答2:
You can check if the username
exists with the clean_username
method and raise ValidationError:
def clean_username(self, username):
user_model = get_user_model() # your way of getting the User
try:
user_model.objects.get(username__iexact=username)
except user_model.DoesNotExist:
return username
raise forms.ValidationError(_("This username has already existed."))
If this case, you can show the error in the signup form and do not need to redirect to another page.
update:
As per @Spacedman pointed out a valid point regarding to race conditions on checking username uniqueness on Form logic against DB level's, although your chance of getting this is very unlikely, in case you do here are the relevant SO answers that may worth reading:
How to avoid race condition with unique checks in Django
Race conditions in django
Another update
As per OP's comment, here's another change can be made for the views:
def register_user(request):
# be DRY, the form can be reused for both POST and GET
form = MyRegistrationForm(request.POST or None)
# check both request is a POST and the form is valid
# as you don't need to redirect for form errors, remove else block
# otherwise it's going to redirect even form validation fails
if request.method == 'POST' and form.is_valid():
form.save()
return HttpResponseRedirect('/accounts/register_success')
# I use render so need not update the RequestContext, Django does it for you
html = render(request, 'register.html', {'form': form})
return HttpResponse(html)
Hope this helps.
回答3:
if you are using django's built in Usercreationform then simply type in your template:
{{form.errors}}
This will check almost everything like: 1.whether user is created or not 2.passwords are matching or not
来源:https://stackoverflow.com/questions/29588808/django-how-to-check-if-username-already-exists