简体   繁体   中英

Give access from admin panel to users that registered in django

So, I am trying to allow users to login after they registered AND only after I decide whether they are eligible for signing in or not.

Basically, the flow that I'd like is the next one:

  1. user tries to log in -> if he is not registered, click on a register link (done)
  2. user type in some data in the registration form and submits it (done)
  3. now, the data will appear in Django admin panel.

I would like a way of approving users data, and only after, to allow him to sign in.

My code so far:

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>

Any ideas, please ?

You can save user with is_active flag false, and then when you decide activate that user ( is_active to True). Users with is_active=False can't log in but appear for you in admin panel.

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()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM