django - userloginform - html logout




用Django中的自定義字段擴展用戶模型 (6)

像Pro一樣擴展Django用戶模型(UserProfile)

我發現這非常有用: link

摘錄:

從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的身份驗證應用程序捆綁在一起)的最佳方式是什麼? 我也可能想使用電子郵件作為用戶名(用於驗證目的)。

我已經看到了few ways來做到這一點,但不能決定哪一個是最好的。


注意:此答案已棄用。 如果您使用的是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

以下是來自文檔的更多信息

docs.djangoproject.com/en/dev/topics/auth/…

更新:請注意, AUTH_PROFILE_MODULE自v1.5 AUTH_PROFILE_MODULE已棄用: https://docs.djangoproject.com/en/1.5/ref/settings/#auth-profile-moduleAUTH_PROFILE_MODULE


下面是擴展用戶的另一種方法。 我覺得上面兩種方法比較清楚,容易,可讀。

few

使用上面的方法:

  1. 您不需要使用user.get_profile()。newattribute來訪問與用戶相關的附加信息
  2. 你可以通過user.newattribute直接訪問額外的新屬性

在Django 1.5中新增了,現在您可以創建自己的自定義用戶模型(這在上述情況下似乎是件好事)。 參考'在Django中定制認證'

可能是1.5版本中最酷的新功能。


每次創建用戶時,都可以通過使用django發布保存信號創建新條目來簡單地擴展用戶配置文件

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)

這將在創建新用戶時自動創建員工實例。

如果您希望擴展用戶模型,並希望在創建用戶時添加更多信息,則可以使用django-betterforms( http://django-betterforms.readthedocs.io/en/latest/multiform.html )。 這將創建一個用戶添加表單,其中包含userProfile模型中定義的所有字段。

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




django-users