2009-05-22 18 views
11

Mô hình User của Django mặc định có một số trường và quy tắc xác thực mà tôi không thực sự cần. Tôi muốn đăng ký càng đơn giản càng tốt, nghĩa là yêu cầu email hoặc tên người dùng hoặc số điện thoại - tất cả những thứ đó là duy nhất, do đó tốt như số nhận dạng người dùng.Làm thế nào để thay đổi mô hình người dùng mặc định django để phù hợp với nhu cầu của tôi?

Tôi cũng không thích bộ ký tự mặc định cho tên người dùng được xác thực trong mô hình người dùng Django. Tôi muốn cho phép bất kỳ nhân vật nào ở đó - tại sao không?

Tôi đã sử dụng ứng dụng django hồ sơ người dùng trước để thêm tiểu sử cho người dùng - nhưng lần này tôi muốn làm cho lớp học bắt chước. Nhưng tôi vẫn muốn sử dụng lớp học User, vì nó mang lại cho tôi một cách dễ dàng để có các phần của trang web bị hạn chế chỉ dành cho người dùng đăng nhập.

Làm cách nào để làm điều đó?

Trả lời

8

Thay vì sửa đổi lớp người dùng trực tiếp hoặc làm lớp con, bạn cũng có thể chỉ định lại các trường hiện có.

Đối với một trang web tôi đã sử dụng trường "first_name" làm "tên được hiển thị công khai" của người dùng và nội dung phiên bản được thêm vào trường "tên người dùng" (để sử dụng trong URL). Tôi đã viết một phụ trợ auth tùy chỉnh để cho phép mọi người đăng nhập bằng cách sử dụng "tên công cộng" của họ hoặc địa chỉ email của họ, và tôi thực thi sự độc đáo của cả hai người trong thời gian đăng ký. Tính năng này phát độc đáo với các ứng dụng có thể tái sử dụng khác và không giới thiệu thêm các bảng hoặc truy vấn.

Đối với một trang web khác, tôi hoàn toàn không muốn tên người dùng, chỉ email duy nhất. Để đáp ứng nhu cầu của Django cho một tên người dùng duy nhất, tôi chỉ băm địa chỉ email và sử dụng như tên người dùng (bạn phải mã hóa base64 băm để nén nó dưới 30 ký tự). Tùy chỉnh auth backend để cho phép đăng nhập bằng email.

Nếu tính tương thích ngược không phải là vấn đề, có rất nhiều cải tiến mà tôi muốn xem được thực hiện với django.contrib.auth và mô hình Người dùng để làm cho chúng linh hoạt hơn. Nhưng có khá nhiều điều bạn có thể làm bên trong những hạn chế hiện tại với một chút sáng tạo.

+0

Bất kỳ ý tưởng nào về cách xây dựng chương trình phụ trợ auth để đăng nhập bằng email? – kender

+0

Xem đoạn trích này để bạn bắt đầu: http://www.djangosnippets.org/snippets/74/ Hãy chắc chắn đọc nhận xét vì mã trong nhận xét thứ 2 tốt hơn đoạn mã trong đoạn trích và rất nhiều các vấn đề khác có liên quan được nêu ra trong các nhận xét mà bạn sẽ muốn ghi nhớ. –

7

Mô hình Người dùng Django được cấu trúc rất hợp lý. Bạn thực sự không muốn cho phép các ký tự tùy ý trong một tên người dùng, ví dụ, và có nhiều cách để đạt được email address login, mà không có thay đổi đột nhập vào mô hình cơ sở.

Để chỉ lưu trữ thông tin bổ sung xung quanh tài khoản người dùng, Django hỗ trợ khái niệm hồ sơ người dùng. Trong khi bạn không cần phải dựa vào sự hỗ trợ để xử lý, nó là một quy ước thường được theo sau và nó sẽ cho phép bạn chơi tốt đẹp với các ứng dụng Django tái sử dụng được thả nổi xung quanh trong ether. Để biết thêm thông tin, xem here.

Nếu bạn muốn thực sự sửa đổi Mô hình người dùng cốt lõi mà còn "chơi đẹp" với các ứng dụng có thể tái sử dụng dựa vào nó, bạn đang mở một chút của Hộp Pandora. Các nhà phát triển đưa ra các giả định cơ bản về cách cấu trúc thư viện cốt lõi, vì vậy bất kỳ thay đổi nào cũng có thể gây ra sự cố không mong muốn. Tuy nhiên, bạn có thể thay đổi monkeypatch thành mô hình cơ sở, hoặc chi nhánh một bản sao của Django cục bộ. Tôi sẽ ngăn cản người thứ hai, và chỉ giới thiệu người cũ nếu bạn biết mình đang làm gì.

+6

Mô hình người dùng Django được cấu trúc "hợp lý" ở chỗ nếu bạn xây dựng một trang web, nó sẽ là một mô hình Người dùng hợp lý cho một bộ nhu cầu cụ thể. Nhưng với tư cách là người dùng trừu tượng cho một khung công tác, nó để lại một số tính linh hoạt để được mong muốn. –

+2

Tôi đồng ý rằng một hệ thống xác thực có thể cắm thêm được mong muốn –

7

Tôi đã đọc sai câu hỏi. Hy vọng bài đăng này hữu ích cho bất kỳ ai khác.

#in models.py 
from django.db.models.signals import post_save 

class UserProfile(models.Model): 
    user = models.ForeignKey(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' 

Điều này sẽ tạo một hồ sơ người dùng mỗi khi người dùng được lưu nếu được tạo. Sau đó bạn có thể sử dụng

user.get_profile().whatever 

Dưới đây là một số thông tin nhiều hơn từ các tài liệu

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

0

Bạn phải đối mặt với một chút của một tiến thoái lưỡng nan mà thực sự có hai giải pháp nếu bạn đang cam kết tránh hồ sơ cá nhân tùy chỉnh dựa trên đã được chỉ ra.

  1. Thay đổi mô hình User bản thân, mỗi lời đề nghị Daniel
  2. Viết một lớp CustomUser, subclassing User hay sao chép chức năng của nó.

Các gợi ý sau có nghĩa là bạn sẽ phải thực hiện một số điều mà User không tự động bằng tay, nhưng tôi tự hỏi liệu đó là như xấu như âm thanh, đặc biệt là nếu bạn đang ở đầu của dự án. Tất cả những gì bạn phải làm là viết lại một lớp đồ trung và một số trang trí.

Tất nhiên, tôi không nghĩ rằng điều này mua cho bạn bất cứ điều gì mà 1 sẽ không giúp bạn, ngoại trừ dự án của bạn không nên phá vỡ nếu bạn svn update django của bạn. Nó có thể tránh được một số vấn đề tương thích với các ứng dụng khác, nhưng tôi đoán là hầu hết các vấn đề sẽ tồn tại theo một trong hai cách.

0

Có nhiều cách để làm điều này, nhưng đây là những gì tôi làm: Tôi cho phép người dùng nhập email, tên người dùng (phải chứa ít nhất một chữ cái và không có @ ký hiệu) hoặc số di động. Sau đó, khi tôi xác thực:

  1. Kiểm tra sự hiện diện của @. Nếu có, hãy đặt nó làm email của người dùng, băm nó một cách thích hợp và đặt nó làm tên người dùng của họ.
  2. Kiểm tra xem đó chỉ là số, dấu gạch ngang và +. Sau đó, loại bỏ các ký tự thích hợp và lưu nó dưới dạng cả số điện thoại di động và tên người dùng (nếu bạn đang lưu trữ số điện thoại di động trong một mô hình khác cho các mục đích SMS hoặc một cái gì đó).
  3. Nếu không, chỉ cần đặt làm tên người dùng.

Tôi cũng xác thực trường người dùng/điện thoại/email tương tự khi đăng nhập và tìm nơi thích hợp để nếu người dùng đăng ký bằng số di động của họ và sau đó thay đổi tên người dùng của họ mục đích), họ vẫn có thể đăng nhập bằng số điện thoại di động của họ.

Các vấn đề liên quan