8

Tôi đang cố gắng sử dụng AbstractUser để thêm một trường vào mô hình Người dùng chuẩn của Django. Đây là mã của tôi:Lỗi cơ sở dữ liệu: không có bảng như vậy: auth_user. Mở rộng AbstractUser và sử dụng mô hình để đăng ký trên admin

class GUser(AbstractUser): 
    uuid = UUIDField(auto=True) 

này đã thành công vì từ vỏ tôi có thể nói,

>>> a = GUser.objects.all() 

>>> a 
[<GUser: User1>] 

>>> a[0].uuid 
UUID('7d1f0b7b52144a2ea20db81ce74741e3') 

Vấn đề tôi đang gặp là đăng ký một người dùng mới từ/admin. Khi tôi tạo một người dùng mới, tôi nhận được một lỗi cơ sở dữ liệu:

no such table: auth_user 

Trước khi tôi nhận được nhiều hơn vào nó, đây là forms.py tôi:

class GUserChangeForm(UserChangeForm): 
    class Meta: 
     model = get_user_model() 

class GUserCreationForm(UserCreationForm): 

    class Meta: 
     model = get_user_model() 

    def clean_username(self): 
      username = self.cleaned_data["username"] 
      try: 
       get_user_model().objects.get(username=username) 
      except get_user_model().DoesNotExist: 
       return username 
      raise forms.ValidationError(self.error_messages['duplicate']) 

Và admin.py tôi:

class GUserAdmin(UserAdmin): 
    form = GUserChangeForm 
    add_form = GUserCreationForm 
    fieldsets = (
     (None, {'fields': [('username', 'password')]}), 
     ('Personal info', {'fields': ('is_active','is_staff','is_superuser','groups', 'user_permissions')}), 
     ('Important dates', {'fields': ('last_login', 'date_joined')}), 
     #('Universal ID', {'fields': ('uuid')}) 
     ) 

admin.site.register(GUser,GUserAdmin) 

Tôi đọc rằng khi điều này xảy ra với những người khác mà họ đã triển khai Biểu mẫu của riêng họ (như tôi đã làm) để ghi đè clean_username (tự):

Tuy nhiên tôi không nghĩ rằng đây là nhận được gọi là khi tôi cố gắng để thêm một người dùng từ admin. Tệp auth.forms.py đang được gọi ngay cả khi tôi đăng ký GUserAdmin của mình.

Ngoài ra, khi tôi xóa cơ sở dữ liệu của mình (sqlite3) và sau đó gọi python manage.py syncdb, tôi thấy rằng bảng auth_user thực sự không được tạo.

Có, tôi đã bao gồm AUTH_USER_MODEL trong settings.py.

Mọi trợ giúp sẽ được đánh giá cao.

Tôi đã đọc: https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#custom-users-and-the-built-in-auth-forms

Cùng với tấn SO bài viết nhưng không ai trong số họ dường như khắc phục vấn đề tôi gặp phải.

+1

Dường như chuỗi này có câu trả lời của bạn: https://groups.google.com/forum/#! topic/django-users/kovey9zYn5c Dường như, Custom Model không tôn trọng 'Meta' cho người quản lý – karthikr

+0

@karthikr Tôi đã xem trang đó nhưng không chắc liệu chúng tôi có gặp vấn đề chính xác không. Là giải pháp để thực sự thay đổi mã trong auth.forms.py? – FrancescoA

+0

Tôi nghĩ rằng đó là câu trả lời của Scott Anderson vào ngày 20 tháng 3 – karthikr

Trả lời

0

Vì vậy, đã xóa tất cả công việc tôi đã thực hiện với điều này và đã tiếp tục với người dùng chuẩn để tôi có thể tiến bộ. Rồi một ngày tôi quay trở lại với nó và cố gắng làm cho nó hoạt động trong một giờ. Tôi sẽ đăng mã để tham khảo nhưng tôi thực sự không thể xác định điểm nào tạo nên sự khác biệt. Tôi biết rằng các hình thức sáng tạo và các công cụ không cần thiết.

models.py

class PropaUser(AbstractUser): 
    uuid = UUIDField(auto=True) 

admin.py

from django.contrib import admin 
from login.models import PropaUser 

admin.site.register(PropaUser) 

settings.py

AUTH_USER_MODEL = "login.PropaUser" 

models.py khác

class Word(models.Model): 
    user = models.ManyToManyField(settings.AUTH_USER_MODEL) 
    deck = models.ManyToManyField(Deck) 
    word = models.CharField(max_length=100) 

    def __unicode__(self): # Python 3: def __str__(self): 
    return self.word 

Đây là những gì đang hoạt động. Tôi không biết những gì đã gây ra tất cả các vấn đề trước bởi vì tôi nghĩ rằng tôi đã thử phương pháp này trước khi đăng câu hỏi này. Đây có thể không phải là câu trả lời thỏa đáng nhưng đây là những gì đang hoạt động. Trước đó tôi cũng đã nhầm lẫn về những gì nó chỉ đơn giản là để thêm một trường cho người dùng hiện tại. Đây chính là nó.

+0

Tôi có cùng một vấn đề ngay bây giờ. Nó hoạt động khi người ta không đăng ký với một cái gì đó được thừa kế từ "UserAdmin". 'admin.site.register (GUser, GUserAdmin)' so với 'admin.site.register (PropaUser) ' – toabi

+0

Khi tôi thử điều này với Django 1.6, tôi đã chỉ có thể chỉnh sửa trực tiếp tất cả các trường trực tiếp (bao gồm cả kết quả băm được xây dựng trong trường mật khẩu)! – aaaronic

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