Pertanyaan Pendaftaran Django: Email sebagai nama pengguna


Bagaimana cara menggunakan email, bukan nama pengguna untuk otentikasi menggunakan pendaftaran Django.

Selanjutnya bagaimana saya menegakkan perubahan ini setelah saya menginstal modul registrasi.

Apakah saya mengedit solusinya di sini Adakah yang tahu peretasan yang bagus untuk membuat pendaftaran django menggunakan email sebagai nama pengguna? di folder lib?


32
2018-06-15 21:29


asal


Jawaban:


Rekan Dekan Django yang terhormat,

Saya pikir ini adalah cara terbaik untuk melakukannya. Semoga berhasil!

Langkah pertama, adalah membuat formulir yang ingin Anda gunakan.

proyek / akun / forms.py

from django import forms
from registration.forms import RegistrationForm
from django.contrib.auth.models import User

class Email(forms.EmailField): 
    def clean(self, value):
        super(Email, self).clean(value)
        try:
            User.objects.get(email=value)
            raise forms.ValidationError("This email is already registered. Use the 'forgot password' link on the login page")
        except User.DoesNotExist:
            return value


class UserRegistrationForm(forms.Form):
    password1 = forms.CharField(widget=forms.PasswordInput(), label="Password")
    password2 = forms.CharField(widget=forms.PasswordInput(), label="Repeat your password")
    #email will be become username
    email = Email()

    def clean_password(self):
        if self.data['password1'] != self.data['password2']:
            raise forms.ValidationError('Passwords are not the same')
        return self.data['password1']

Di sini Anda membuat file untuk mengesampingkan fungsi register () dalam pendaftaran Django. 

proyek / akun / regbackend.py

from django.conf import settings
from django.contrib.sites.models import RequestSite
from django.contrib.sites.models import Site

from registration import signals
from registration.forms import RegistrationForm
from registration.models import RegistrationProfile

from registration.backends import default


class Backend(default.DefaultBackend):
    def register(self, request, **kwargs):
        email, password = kwargs['email'], kwargs['password1']
        username = email
        if Site._meta.installed:
            site = Site.objects.get_current()
        else:
            site = RequestSite(request)
        new_user = RegistrationProfile.objects.create_inactive_user(username, email,
                                                                    password, site)
        signals.user_registered.send(sender=self.__class__,
                                     user=new_user,
                                     request=request)
        return new_user

Arahkan url Anda ke jalur yang ingin Anda gunakan.

proyek / urls.py

(r'^accounts/', include('registration.backends.default.urls')),

Beri tahu url Anda untuk menggunakan backend khusus untuk tampilan pendaftaran. Juga, impor formulir yang Anda buat dan tambahkan ke url untuk diproses oleh tampilan.

proyek / akun / urls.py

from django.conf.urls.defaults import *
from registration.backends.default.urls import *
from accounts.forms import UserRegistrationForm

urlpatterns += patterns('',

    #customize user registration form
    url(r'^register/$', 'registration.views.register',
        {
            'backend': 'accounts.regbackend.Backend',
            'form_class' : UserRegistrationForm
        },
        name='registration_register'
    ),

) 

Semoga berhasil!

-Matt


32
2018-06-17 00:42



Untuk Django> = 1.3 dan <1.5 ada Email Django sebagai nama pengguna di github.

Baru-baru ini saya menggunakan pendaftaran dan saya beralih dengan mudah ke django-pendaftaran-email. Ia bekerja dengan baik pada Django 1.4, menggunakan kembali templat yang sama dan hanya menambahkan REGISTRATION_EMAIL_ACTIVATE_SUCCESS_URL = "/profiles/create/" untuk mengalihkan ke Profil halaman pembuatan.

Django 1.5 mengatasi masalah ini melalui model Pengguna khusus di mana Anda bisa menentukan bidang apa yang digunakan sebagai nama pengguna. Sebagaimana tercantum dalam dokumentasi Django 1.5:

String yang menggambarkan nama bidang pada model Pengguna yang digunakan sebagai pengidentifikasi unik. Biasanya ini adalah nama pengguna, tetapi juga bisa berupa alamat email, atau pengenal unik lainnya.


5
2017-10-20 16:32



Cara termudah adalah menyembunyikannya nama pengguna bidang di formulir pendaftaran template dengan CSS display: none milik. Dan tambahkan skrip yang mengambil nilai dari e-mail bidang formulir dan menetapkan nilai dalam tersembunyi nama pengguna bidang. Jadi saat mengirimkan formulir, pengguna mengirimkan email sebagai nama pengguna tanpa menyadarinya. Satu-satunya masalah adalah karena bidang nama pengguna, secara default, tidak dapat menerima email yang lebih panjang dari 30 karakter. Jadi, untuk taruhan aman, Anda harus meningkatkan panjang nama pengguna secara manual di database Anda.

Berikut adalah template registration_form.html baru:

<form method="post" action="" class="wide">
  {% csrf_token %}
  <dl>
    <div style="display:none">
      <dt>
        <label for="id_username">Username:</label>
        {% if form.username.errors %}
          <span class="error">{{ form.username.errors.as_text }}</span>
        {% endif %}
      </dt>
      <dd>{{ form.username }}</dd>
     </div>
    
    <dt>
      <label for="id_email">Email address:</label>
      {% if form.email.errors %}
        <span class="error">{{ form.email.errors.as_text }}</span>
      {% endif %}
     </dt>
    <dd>{{ form.email }}</dd>
    
    <br>
    
    <dt>
      <label for="id_password1">Password:</label>
      {% if form.password1.errors %}
        <span class="error">{{ form.password1.errors.as_text }}</span>
      {% endif %}
     </dt>
    
    <dd>{{ form.password1 }}</dd>
    <br>
    
    <dt>
      <label for="id_password2">Password (type again to catch typos):</label>
      {% if form.password2.errors %}
        <span class="error">{{ form.password2.errors.as_text }}</span>
      {% endif %}
     </dt>
    
    <dd>{{ form.password2 }}</dd>
    
	<br>
    <dt><input type="submit" value="Sign up" /></dt>
  </dl>    
</form>

Srcipt jQuery sederhana yang menetapkan nilai dalam bidang formulir tersembunyi nama pengguna aku s:

$(document).ready(function()
{
  $('#id_email').blur(function(e)
  {
    var email_address = $('#id_email').val();
    $('#id_username').val(email_address);
   });
});

ID-nya id_email dan id_username diatur oleh formulir pendaftaran Django secara otomatis.


5
2017-10-25 07:16