2010-02-17 28 views
7

Có một câu hỏi gần giống nhau: How to make email field unique in model User from contrib.auth in DjangoTạo trường email duy nhất với Django Quản trị viên người dùng

Giải pháp không hoàn hảo: Xác thực email cho tính duy nhất. Các giải pháp được cung cấp là khá buồn cười. Nó không cho phép sửa đổi đối với Người dùng để lại email nguyên vẹn. Làm thế nào để sửa chữa nó? Cảm ơn trước!

+0

mà trong những giải pháp đề xuất được bạn nói về? giải pháp được chấp nhận? –

+0

Có. Người được chấp nhận. – Viet

+0

Tôi trả lời trong câu hỏi khác. Tôi nghĩ rằng điều này nên được đóng lại vì nó là một bản sao hoàn chỉnh. –

Trả lời

2

Nhờ Ofri Raviv nhưng những gì tôi đã thấy không phải là những gì tôi cần. Vì vậy, tôi đã giải quyết vấn đề của riêng mình và giờ tôi muốn chia sẻ các mẹo:

  1. Sử dụng tên người dùng thay vì email, loại trừ email khỏi biểu mẫu. Mặt nạ nhãn của nó dưới dạng email.

  2. Người dùng lớp con và tạo trường UNIQUE nhận địa chỉ email, che dấu nó dưới dạng email, loại trừ trường email gốc khỏi biểu mẫu.

Thật đơn giản nhưng đã dành thời gian cho tôi. Hy vọng nó giúp người khác với cùng một nhu cầu.

17

trong __init__.py

from django.contrib.auth.models import User 

User._meta.get_field_by_name('email')[0]._unique = True 
+0

+1 cảm ơn. Tôi sẽ thử nó. – Viet

+1

khỉ-pathcing là xấu, nhưng contib.auth là như vậy thiết kế xấu, mà sử dụng khỉ vá ở đây nên không có xấu hổ ở tất cả. – DataGreed

+0

Tôi hỏi làm rõ về init.py, vui lòng. Có hàng chục __init__.py trong dự án của tôi. Ý bạn là cái nào? Hmm .. stackoverflow không hiển thị gạch chân, điều này gây nhầm lẫn ... –

0

Phương pháp này bạn sẽ không làm cho lĩnh vực email duy nhất ở cấp cơ sở dữ liệu, nhưng nó có giá trị cố gắng.

Sử dụng một tùy chỉnh validator:

from django.core.exceptions import ValidationError 
from django.contrib.auth.models import User 

def validate_email_unique(value): 
    exists = User.objects.filter(username=value) 
    if exists: 
     raise ValidationError("Email address %s already exits, must be unique" % value) 

Sau đó, trong forms.py:

from django.contrib.auth.models import User 
from django.forms import ModelForm 
from main.validators import validate_email_unique 


class UserForm(ModelForm): 
    #.... 
    email = forms.CharField(required=True, validators=[validate_email_unique]) 
    #.... 
+0

Giải pháp này hơi thiếu sót trong UserForm chỉ có thể được sử dụng để tạo người dùng. Nếu bạn sử dụng nó để chỉnh sửa một người dùng, "tồn tại" sẽ là đúng ngay cả khi đó là một kết quả mong đợi. –

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