Bagaimana cara membuat pengguna di Django?

91

Saya mencoba untuk membuat Pengguna baru dalam proyek Django dengan kode berikut, tetapi baris yang disorot memicu pengecualian.

def createUser(request):
    userName = request.REQUEST.get('username', None)
    userPass = request.REQUEST.get('password', None)
    userMail = request.REQUEST.get('email', None)

    # TODO: check if already existed

    **user = User.objects.create_user(userName, userMail, userPass)**
    user.save()

    return render_to_response('home.html', context_instance=RequestContext(request))

Ada bantuan?

Amr M. AbdulRahman
sumber
6
Pengecualian apa?
César
2
@ user1364223 Pengecualian traceback?
Joseph Victor Zammit
Saya pikir User.objects.create harus berfungsi. docs.djangoproject.com/en/1.4/ref/models/querysets/#create
iJK

Jawaban:

188

Cara yang benar untuk membuat pengguna di Django adalah dengan menggunakan fungsi create_user. Ini akan menangani hashing kata sandi, dll ..

from django.contrib.auth.models import User
user = User.objects.create_user(username='john',
                                 email='[email protected]',
                                 password='glass onion')
keithhackbarth
sumber
akankah ini hash kata sandinya?
mp3por
8
@ mp3por - Ya. Untuk dokumentasi lengkap, buka di sini docs.djangoproject.com/en/1.9/ref/contrib/auth/…
keithhackbarth
2
bagaimana / di mana saya menjalankan ini? Jika saya hanya menjalankan kode itu, saya mendapatkan django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.EDIT: ini berfungsiDJANGO_SETTINGS_MODULE=app.settings.dev python manage.py shell < register-user.py
citynorman
4
Sebagai pembaruan untuk Django yang lebih modern, gunakan from django.contrib.auth import get_user_modeldanuser = get_user_model().objects.create_user(...
Mark Chackerian
@keithhackbarth di file manakah saya harus memasukkan kode ini dalam struktur file django?
Hangon
23

Sudahkah Anda memastikan bahwa Anda menyampaikan nilai sebenarnya dan tidak None?

from django.shortcuts import render

def createUser(request):
    userName = request.REQUEST.get('username', None)
    userPass = request.REQUEST.get('password', None)
    userMail = request.REQUEST.get('email', None)

    # TODO: check if already existed
    if userName and userPass and userMail:
       u,created = User.objects.get_or_create(userName, userMail)
       if created:
          # user was created
          # set the password here
       else:
          # user was retrieved
    else:
       # request was empty

    return render(request,'home.html')
Burhan Khalid
sumber
1
Jika tidak ada, bukankah metode .is_valid () akan gagal?
mp3por
11

Pembuatan pengguna massal dengan set_password

Saya Anda membuat beberapa pengguna uji, bulk_createjauh lebih cepat, tetapi kami tidak dapat menggunakannya create_user.

set_password adalah cara lain untuk membuat sandi berciri:

def users_iterator():
    for i in range(nusers):
        is_superuser = (i == 0)
        user = User(
            first_name='First' + str(i),
            is_staff=is_superuser,
            is_superuser=is_superuser,
            last_name='Last' + str(i),
            username='user' + str(i),
        )
        user.set_password('asdfqwer')
        yield user

class Command(BaseCommand):
    def handle(self, **options):
        User.objects.bulk_create(iter(users_iterator()))

Pertanyaan khusus tentang pencirian kata sandi: Bagaimana menggunakan Bcrypt untuk mengenkripsi kata sandi di Django

Diuji di Django 1.9.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
1
jauh lebih baik daripada diterima; jika Anda mempertimbangkan untuk menambahkan pengguna secara terprogram, Anda mungkin mengotomatiskan sesuatu untuk lebih banyak kegunaan.
Sławomir Lenart
5

Jika Anda membuat pengguna secara normal, Anda tidak akan dapat login karena metode pembuatan kata sandi mungkin berbeda Anda dapat menggunakan formulir pendaftaran default untuk itu

from django.contrib.auth.forms import UserCreationForm

Anda juga bisa memperpanjangnya

from django.contrib.auth.forms import UserCreationForm

class UserForm(UserCreationForm):
    mobile = forms.CharField(max_length=15, min_length=10)
    email = forms.EmailField(required=True)
    class Meta:
        model = User
        fields = ['username', 'password', 'first_name', 'last_name', 'email', 'mobile' ]

Kemudian di lihat gunakan kelas ini

class UserCreate(CreateView):
    form_class = UserForm
    template_name = 'registration/signup.html'
    success_url = reverse_lazy('list')

    def form_valid(self, form):
        user = form.save()
Nids Barthwal
sumber
1
Saya pikir ada kesalahan saat membuat UserForm dengan memperluas forms.ModelForm. Saya pikir itu harus memperpanjang UserCreationForm sebagai gantinya
vladimir.gorea
Selain itu, bukankah seharusnya form_class dari tampilan kelas UserCreate menjadi UserForm?
vladimir.gorea