2015-08-29 4 views
0

Итак, я пытаюсь разрешить пользователям входить в систему после регистрации AND только после того, как я решаю, имеют ли они право на вход или нет.Предоставить доступ с панели администратора пользователям, зарегистрированным в django

В основном, поток, который я хотел бы это следующий:

  1. пользователь пытается войти в систему -> если он не зарегистрирован, нажмите на ссылку регистра (сделано)
  2. введите данные пользователя в регистрационную форму и отправьте ее (сделано)
  3. Теперь данные появятся на панели администратора 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> 

Любые идеи, пожалуйста?

ответ

1

Вы можете сохранить пользователя с флагом is_active, а затем, когда вы решите активировать этого пользователя (is_active - True). Пользователи с is_active=False не могут войти в систему, но отображаются в панели администратора.

user = User.objects.create_user(
      username=form.cleaned_data['username'], 
      password=form.cleaned_data['password1'], 
      email=form.cleaned_data['email'], 
     ) 
user.is_active = False 
user.save() 
+0

Когда я добавляю это, я получаю следующую ошибку: 'Объект ModelBase получил несколько значений для аргумента ключевого слова is_active''. Есть идеи ? –

+0

Я отредактировал свой ответ, теперь это определенно сработает. Эта ошибка была вызвана реализацией 'create_user', которая принимает' extra_fields', но имеет жестко закодированную 'is_active = True' при создании модели. – beezz

+0

Но это окончательно [исправлено в главной ветке] (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

Смежные вопросы