दिलचस्प पोस्ट
64 बिट प्रक्रिया से 32 बिट कोड कॉलिंग क्या विदेशी सूची फ़ील्ड्स के एक Django ModelAdmin प्रदर्शन विशेषताओं में "list_display" कर सकते हैं? एंड्रॉइड – लॉन्चर आइकन आकार विज़िटर का देश अपने आईपी से प्राप्त करना एंड्रॉइड एपीआई 21 टूलबार पट्टी मैं एक निर्देशिका की सभी फाइलों को कैसे सूचीबद्ध करूं? आप एक ही वेबपेज पर एकाधिक MySQL डाटाबेस से कैसे जुड़ सकते हैं? क्या एसक्यूएललेमी के पास डीजांगो के गेट_ओआरएक्रेट के बराबर है? पूर्णांक डिवीजन कोड गलत जवाब क्यों देता है? उपप्रक्रिया में 'शेल = ट्रू' का वास्तविक अर्थ ggplot के qplot सोर्सिंग पर निष्पादित नहीं करता है एकाधिक अतुल्यकालिक NSURL कनेक्शन कनेक्शन का प्रबंधन थ्रेड से यूआई अपडेट करें इनलाइन और ब्लॉक कोड स्निपेट के लिए <code> बनाम <पूर्व> बनाम <samp> एडीओडीबी और सामान्य वेबसाइट सुरक्षा में एसक्यूएल इंजेक्शन

Django में कस्टम फ़ील्ड के साथ यूजर मॉडल का विस्तार

कस्टम फ़ील्ड के साथ उपयोगकर्ता मॉडल (Django के प्रमाणीकरण ऐप के साथ बंडल) का विस्तार करने का सबसे अच्छा तरीका क्या है? मैं संभवत: ईमेल को उपयोगकर्ता नाम के रूप में उपयोग करना चाहूंगा (प्रमाणीकरण उद्देश्यों के लिए)

मैंने पहले से ही ऐसा करने के कुछ तरीके देखे हैं, लेकिन यह तय नहीं कर सकता कि कौन सबसे अच्छा है

वेब के समाधान से एकत्रित समाधान "Django में कस्टम फ़ील्ड के साथ यूजर मॉडल का विस्तार"

कम से कम दर्दनाक और वास्तव में ऐसा करने का OneToOneField(User) -अनुशंसित तरीका एक OneToOneField(User) संपत्ति के माध्यम से होता है।

मौजूदा यूजर मॉडल को विस्तारित करना

यदि आप User से संबंधित जानकारी संग्रहीत करना चाहते हैं, तो आप अतिरिक्त जानकारी के लिए फ़ील्ड वाले मॉडल से एक -से-एक रिलेशनशिप का उपयोग कर सकते हैं। यह एक-से-एक मॉडल को अक्सर एक प्रोफ़ाइल मॉडल कहा जाता है, क्योंकि यह एक साइट उपयोगकर्ता के बारे में गैर-सूचना संबंधित जानकारी संग्रहीत कर सकता है।

उसने कहा, django.contrib.auth.models.User विस्तार और यह भी काम करता है …

एक कस्टम उपयोगकर्ता मॉडल को प्रतिस्थापित करना

कुछ प्रकार की परियोजनाओं में प्रमाणीकरण की आवश्यकता हो सकती है जिसके लिए डीजेंगो का अंतर्निर्मित User मॉडल हमेशा उपयुक्त नहीं होता है। उदाहरण के लिए, कुछ साइटों पर यह एक उपयोगकर्ता नाम के बजाय आपकी पहचान टोकन के रूप में ईमेल पते का उपयोग करने के लिए अधिक समझदारी बनाता है

[एड: दो चेतावनियां और अधिसूचना का पालन करें , यह उल्लेख करना कि यह बहुत कठिन है ।]

मैं निश्चित रूप से अपने डीजेंगो स्रोत पेड़ में वास्तविक उपयोगकर्ता वर्ग को बदलने से और / या एट मॉड्यूल को प्रतिलिपि और बदलने से दूर रहूंगा।

नोट: यह उत्तर बहिष्कृत है। यदि आप Django 1.7 या बाद के संस्करण का उपयोग कर रहे हैं तो अन्य उत्तर देखें।

यह मेरा इसे करने का तरीका है।

 #in models.py from django.contrib.auth.models import User from django.db.models.signals import post_save class UserProfile(models.Model): user = models.OneToOneField(User) #other fields here def __str__(self): return "%s's profile" % self.user def create_user_profile(sender, instance, created, **kwargs): if created: profile, created = UserProfile.objects.get_or_create(user=instance) post_save.connect(create_user_profile, sender=User) #in settings.py AUTH_PROFILE_MODULE = 'YOURAPP.UserProfile' 

यह एक यूजरप्रोफाइल बनाएगा, जब कोई उपयोगकर्ता सहेजा जाता है, तो उसे बनाया जाता है। आप तब उपयोग कर सकते हैं

  user.get_profile().whatever 

डॉक्स से कुछ और जानकारी यहां दी गई है

http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

अद्यतन: कृपया ध्यान दें कि AUTH_PROFILE_MODULE v1.5 के बाद से पदावनत है: https://docs.djangoproject.com/en/1.5/ref/settings/#auth-profile-module

खैर, 2008 से कुछ समय बीत चुका है और यह कुछ ताजा जवाब देने का समय है। Django 1.5 के बाद से आप कस्टम यूजर क्लास बनाने में सक्षम होंगे। असल में, जब मैं यह लिख रहा हूं, यह पहले से मास्टर में विलय हो गया है, इसलिए आप इसे आज़मा सकते हैं

डॉक्स में इसके बारे में कुछ जानकारी है या यदि आप इसमें गहराई तक जाना चाहते हैं, तो इस प्रतिबद्ध में

आपको बस कस्टम यूजर क्लास के पथ के साथ सेटिंग में AUTH_USER_MODEL जोड़ना है, जो कि अब तक AbstractBaseUser (अधिक अनुकूलन संस्करण) या AbstractUser (अधिक या कम पुराना उपयोगकर्ता वर्ग जो आप बढ़ा सकते हैं) को बढ़ाता है।

क्लिक करने के लिए आलसी लोगों के लिए, यहां कोड का उदाहरण है ( डॉक्स से लिया गया):

 from django.db import models from django.contrib.auth.models import ( BaseUserManager, AbstractBaseUser ) class MyUserManager(BaseUserManager): def create_user(self, email, date_of_birth, password=None): """ Creates and saves a User with the given email, date of birth and password. """ if not email: raise ValueError('Users must have an email address') user = self.model( email=MyUserManager.normalize_email(email), date_of_birth=date_of_birth, ) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, username, date_of_birth, password): """ Creates and saves a superuser with the given email, date of birth and password. """ u = self.create_user(username, password=password, date_of_birth=date_of_birth ) u.is_admin = True u.save(using=self._db) return u class MyUser(AbstractBaseUser): email = models.EmailField( verbose_name='email address', max_length=255, unique=True, ) date_of_birth = models.DateField() is_active = models.BooleanField(default=True) is_admin = models.BooleanField(default=False) objects = MyUserManager() USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['date_of_birth'] def get_full_name(self): # The user is identified by their email address return self.email def get_short_name(self): # The user is identified by their email address return self.email def __unicode__(self): return self.email def has_perm(self, perm, obj=None): "Does the user have a specific permission?" # Simplest possible answer: Yes, always return True def has_module_perms(self, app_label): "Does the user have permissions to view the app `app_label`?" # Simplest possible answer: Yes, always return True @property def is_staff(self): "Is the user a member of staff?" # Simplest possible answer: All admins are staff return self.is_admin 

उपयोगकर्ताओं के बारे में अतिरिक्त जानकारी रखने के बारे में एक आधिकारिक सिफारिश है Django पुस्तक अनुभाग प्रोफाइल में इस समस्या की भी चर्चा करता है।

Django 1.5 के बाद से आप आसानी से उपयोगकर्ता मॉडल का विस्तार कर सकते हैं और डेटाबेस पर एक मेज रख सकते हैं।

 from django.contrib.auth.models import AbstractUser from django.db import models from django.utils.translation import ugettext_lazy as _ class UserProfile(AbstractUser): age = models.PositiveIntegerField(_("age")) 

आपको इसे अपनी सेटिंग्स फ़ाइल में वर्तमान उपयोगकर्ता वर्ग के रूप में भी कॉन्फ़िगर करना होगा

 # supposing you put it in apps/profiles/models.py AUTH_USER_MODEL = "profiles.UserProfile" 

यदि आप बहुत सारे उपयोगकर्ता की प्राथमिकताएं जोड़ना चाहते हैं तो OneToOneField विकल्प एक बेहतर विकल्प सोचा हो सकता है।

तीसरे पक्ष के पुस्तकालयों के विकास के लोगों के लिए एक नोट: यदि आपको उपयोगकर्ता वर्ग तक पहुंच की आवश्यकता है तो याद रखें कि लोग इसे बदल सकते हैं। सही कक्षा पाने के लिए आधिकारिक सहायक का उपयोग करें

 from django.contrib.auth import get_user_model User = get_user_model() 

नीचे एक उपयोगकर्ता का विस्तार करने के लिए एक और तरीका है। मुझे लगता है कि यह अधिक स्पष्ट, आसान, पठनीय है, फिर दो तरीकों से ऊपर

http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/

उपरोक्त दृष्टिकोण का उपयोग करना:

  1. आपको उपयोगकर्ता से संबंधित अतिरिक्त जानकारी तक पहुंचने के लिए user.get_profile ()। newattribute का उपयोग करने की आवश्यकता नहीं है
  2. आप सीधे उपयोगकर्ता के माध्यम से अतिरिक्त नई विशेषताओं का उपयोग कर सकते हैं

जब आप प्रयोक्ता को डीजेंगो पोस्ट का उपयोग करके सिग्नल बचाएं तो हर बार एक नई एंट्री बनाकर यूज़र प्रोफाइल का विस्तार कर सकते हैं

models.py

 from django.db.models.signals import * from __future__ import unicode_literals class userProfile(models.Model): userName = models.OneToOneField(User, related_name='profile') city = models.CharField(max_length=100, null=True) def __unicode__(self): # __str__ return unicode(self.userName) def create_user_profile(sender, instance, created, **kwargs): if created: userProfile.objects.create(userName=instance) post_save.connect(create_user_profile, sender=User) 

यह स्वचालित रूप से एक कर्मचारी उदाहरण बना देगा जब नया उपयोगकर्ता बनाया जाएगा।

यदि आप उपयोगकर्ता मॉडल का विस्तार करना चाहते हैं और उपयोगकर्ता बनाने के दौरान और जानकारी जोड़ना चाहते हैं तो आप डीजेंगो-बेहतर फ़ॉर्म ( http://django-betterforms.readthedocs.io/en/latest/multiform.html ) का उपयोग कर सकते हैं। इससे यूजरप्रोफेइल मॉडल में परिभाषित सभी फ़ील्ड के साथ एक यूजर एडी फॉर्म बना देगा।

models.py

 from django.db.models.signals import * from __future__ import unicode_literals class userProfile(models.Model): userName = models.OneToOneField(User) city = models.CharField(max_length=100) def __unicode__(self): # __str__ return unicode(self.userName) 

forms.py

 from django import forms from django.forms import ModelForm from betterforms.multiform import MultiModelForm from django.contrib.auth.forms import UserCreationForm from .models import * class profileForm(ModelForm): class Meta: model = Employee exclude = ('userName',) class addUserMultiForm(MultiModelForm): form_classes = { 'user':UserCreationForm, 'profile':profileForm, } 

views.py

 from django.shortcuts import redirect from .models import * from .forms import * from django.views.generic import CreateView class addUser(CreateView): form_class = addUserMultiForm template_name = "addUser.html" success_url = '/your url after user created' def form_valid(self, form): user = form['user'].save() profile = form['profile'].save(commit=False) profile.userName = User.objects.get(username= user.username) profile.save() return redirect(self.success_url) 

addUser.html

 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="." method="post"> {% csrf_token %} {{ form }} <button type="submit">Add</button> </form> </body> </html> 

urls.py

 from django.conf.urls import url, include from appName.views import * urlpatterns = [ url(r'^add-user/$', addUser.as_view(), name='addDistributor'), ] 

एक प्रो जैसे डीजेंगो उपयोगकर्ता मॉडल (यूज़रप्रोफाइल) का विस्तार

मैंने यह बहुत उपयोगी पाया है: लिंक

निष्कर्ष:

django.contrib.auth.models से उपयोगकर्ता आयात करें

 class Employee(models.Model): user = models.OneToOneField(User) department = models.CharField(max_length=100) >>> u = User.objects.get(username='fsmith') >>> freds_department = u.employee.department 

Django 1.5 में नया, अब आप अपना स्वयं का कस्टम उपयोगकर्ता मॉडल बना सकते हैं (जो उपरोक्त मामले में करने के लिए अच्छी बात है)। 'Django में प्रमाणीकरण अनुकूलित करना ' का संदर्भ लें

शायद 1.5 रिलीज पर सबसे अच्छी नई सुविधा।