Итак, я пытаюсь разрешить пользователям входить в систему после регистрации AND только после того, как я решаю, имеют ли они право на вход или нет.Предоставить доступ с панели администратора пользователям, зарегистрированным в django
В основном, поток, который я хотел бы это следующий:
- пользователь пытается войти в систему -> если он не зарегистрирован, нажмите на ссылку регистра (сделано)
- введите данные пользователя в регистрационную форму и отправьте ее (сделано)
- Теперь данные появятся на панели администратора Django.
Я хотел бы способ утверждения данных пользователей, и только после того, чтобы позволить ему войти в
Мой код до сих пор:.
forms.py
class RegistrationForm(forms.Form):
username = forms.RegexField(regex=r'^\w+$', widget=forms.TextInput(attrs=dict(required=True, max_length=30)), label=_("Username"), error_messages={ 'invalid': _("This value must contain only letters, numbers and underscores.") })
email = forms.EmailField(widget=forms.TextInput(attrs=dict(required=True, max_length=30)), label=_("Email address"))
password1 = forms.CharField(widget=forms.PasswordInput(attrs=dict(required=True, max_length=30, render_value=False)), label=_("Password"))
password2 = forms.CharField(widget=forms.PasswordInput(attrs=dict(required=True, max_length=30, render_value=False)), label=_("Password (again)"))
def clean_username(self):
try:
user = User.objects.get(username__iexact=self.cleaned_data['username'])
except User.DoesNotExist:
return self.cleaned_data['username']
raise forms.ValidationError(_("The username already exists. Please try another one."))
def clean(self):
if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
if self.cleaned_data['password1'] != self.cleaned_data['password2']:
raise forms.ValidationError(_("The two password fields did not match."))
return self.cleaned_data
views.py
@csrf_protect
def register(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['password1'],
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,
)
def register_success(request):
return render_to_response(
'registration/success.html',
)
def logout_page(request):
logout(request)
return HttpResponseRedirect('/')
@login_required
def home(request):
return render_to_response(
'home.html', {
'user': request.user
}
)
urls.py
urlpatterns = [
url(r'^$', 'django.contrib.auth.views.login'),
url(r'^logout/$', views.logout_page),
url(r'^accounts/login/$', 'django.contrib.auth.views.login'),
url(r'^register/$', views.register),
url(r'^register/success/$', views.register_success),
url(r'^home/$', views.home),
url(r'^admin/', include(admin.site.urls)),
]
login.html
<form method="post" action=".">
{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}
{% csrf_token %}
<table border="0">
<tr><th><label for="id_username">Name:</label></th><td>{{ form.username }}</td></tr>
<tr><th><label for="id_password">Password:</label></th><td>{{ form.password }}</td></tr>
</table>
<div class="send">
<div class="now" style="text-align: center">
<input type="submit" value="Login" />
<input type="hidden" name="next" value="/home" />
</div>
</div>
</form>
register.html
<form method="post" action=".">{% csrf_token %}
<table border="0">
{{ form.as_table }}
</table>
<input type="submit" value="Register" />
</form>
Любые идеи, пожалуйста?
Когда я добавляю это, я получаю следующую ошибку: 'Объект ModelBase получил несколько значений для аргумента ключевого слова is_active''. Есть идеи ? –
Я отредактировал свой ответ, теперь это определенно сработает. Эта ошибка была вызвана реализацией 'create_user', которая принимает' extra_fields', но имеет жестко закодированную 'is_active = True' при создании модели. – beezz
Но это окончательно [исправлено в главной ветке] (https://github.com/django/django/blob/master/django/contrib/auth/models.py#L139). Но в [1.8] (https://github.com/django/django/blob/stable/1.8.x/django/contrib/auth/models.py#L178) он все еще там. – beezz