2014-06-10 11 views
21

Tôi đang sử dụng mô hình người dùng tùy chỉnh ở Django. Mô hình hoạt động tốt và có thể tạo người dùng. Nhưng khi tôi cố gắng truy cập trang quản trị nó ném cho tôi những lỗiFieldError tại/admin/- (Các) trường không xác định (added_on) được chỉ định cho UserProfile

FieldError at /admin/ 
Unknown field(s) (added_on) specified for UserProfile 

Các UserProfile có một thuộc tính added_on. Tôi không thể nghĩ ra bất kỳ lý do nào tại sao điều này lại hiển thị. Nếu tôi xóa thuộc tính added_on khỏi tệp admin.py, bảng quản trị sẽ hoạt động.

Đây là models.py tôi

from django.db import models 
from django.contrib.auth.models import User, BaseUserManager, AbstractBaseUser 
from django.conf import settings 

class UserProfileManager(BaseUserManager): 
    def create_user(self, email, username, name, password=None): 
     if not email: 
      raise ValueError('Users must have an email address') 

     user = self.model(
      username=username, 
      name=name, 
      email=self.normalize_email(email), 
     ) 

     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_superuser(self, email, username, name, password): 
     user = self.create_user(email=email, 
       password=password, 
       username=username, 
       name=name 
      ) 
     user.is_admin = True 
     user.save(using=self._db) 
     return user 


class UserProfile(AbstractBaseUser): 
    SHOPPER = 1 
    TECH_ENTHU = 2 
    TECH_JUNKIE = 3 
    TECH_NINJA = 4 
    TECH_GURU = 5 
    LEVELS = (
     (SHOPPER, 'Shopper'), 
     (TECH_ENTHU, 'Tech Enthusiast'), 
     (TECH_JUNKIE, 'Tech Junkie'), 
     (TECH_NINJA, 'Tech Ninja'), 
     (TECH_GURU, 'Tech Guru') 
    ) 

    email = models.EmailField(max_length=255, unique=True) 
    username = models.CharField(max_length=100, unique=True) 
    name = models.CharField(max_length=255) 
    location = models.CharField(max_length=255, blank=True, null=True) 
    website = models.CharField(max_length=255, blank=True, null=True) 
    image_1 = models.CharField(max_length=255, blank=True, null=True) 
    image_2 = models.CharField(max_length=255, blank=True, null=True) 
    image_3 = models.CharField(max_length=255, blank=True, null=True) 
    points = models.PositiveIntegerField(default=0) 
    level = models.PositiveSmallIntegerField(choices=LEVELS, default=SHOPPER) 
    added_on = models.DateTimeField(auto_now_add=True) 

    is_active = models.BooleanField(default=True) 
    is_admin = models.BooleanField(default=False) 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['username', 'name'] 

    objects = UserProfileManager() 

    def get_full_name(self): 
     return self.name 

    def get_short_name(self): 
     return self.name 

    def __unicode__(self): 
     return self.email 

    def has_perm(self, perm, obj=None): 
     return True 

    def has_module_perms(self, app_label): 
     return True 

    @property 
    def is_staff(self): 
     return self.is_admin 


class OldUser(models.Model): 
    old_user_id = models.BigIntegerField() 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 
    converted = models.BooleanField(default=False) 

Đây là admin.py tôi

from django import forms 
from django.contrib import admin 
from django.contrib.auth.models import Group 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.forms import ReadOnlyPasswordHashField 

from users.models import UserProfile 

class UserCreationForm(forms.ModelForm): 
    """A form for creating new users. Includes all the required 
    fields, plus a repeated password.""" 
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput) 
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput) 

    class Meta: 
     model = UserProfile 
     fields = ('username', 'name') 

    def clean_password2(self): 
     # Check that the two password entries match 
     password1 = self.cleaned_data.get("password1") 
     password2 = self.cleaned_data.get("password2") 
     if password1 and password2 and password1 != password2: 
      raise forms.ValidationError("Passwords don't match") 
     return password2 

    def save(self, commit=True): 
     # Save the provided password in hashed format 
     user = super(UserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      user.save() 
     return user 


class UserChangeForm(forms.ModelForm): 
    """A form for updating users. Includes all the fields on 
    the user, but replaces the password field with admin's 
    password hash display field. 
    """ 
    password = ReadOnlyPasswordHashField() 

    class Meta: 
     model = UserProfile 
     fields = ('email', 'password', 'username', 'name', 'location', 'website', 'image_1', 'image_2', 'image_3', 
        'points', 'level', 'added_on', 'is_active', 'is_admin') 

    def clean_password(self): 
     # Regardless of what the user provides, return the initial value. 
     # This is done here, rather than on the field, because the 
     # field does not have access to the initial value 
     return self.initial["password"] 


class UserProfileAdmin(UserAdmin): 
    # The forms to add and change user instances 
    form = UserChangeForm 
    add_form = UserCreationForm 

    # The fields to be used in displaying the User model. 
    # These override the definitions on the base UserAdmin 
    # that reference specific fields on auth.User. 
    list_display = ('email', 'username', 'name', 'points', 'level', 'is_admin') 
    list_filter = ('is_admin',) 
    fieldsets = (
     (None, {'fields': ('email', 'password')}), 
     ('Personal info', {'fields': ('username', 'name', 'location', 'website', 'image_1', 'image_2', 'image_3', 
          'points', 'level', 'added_on')}), 
     ('Permissions', {'fields': ('is_admin',)}), 
    ) 
    # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin 
    # overrides get_fieldsets to use this attribute when creating a user. 
    add_fieldsets = (
     (None, { 
      'classes': ('wide',), 
      'fields': ('email', 'username', 'name', 'password1', 'password2')} 
     ), 
    ) 
    search_fields = ('email',) 
    ordering = ('email',) 
    filter_horizontal =() 

admin.site.register(UserProfile, UserProfileAdmin) 
# Since we're not using Django's built-in permissions, 
# unregister the Group model from admin. 
admin.site.unregister(Group) 

Đây là traceback

Environment: 


Request Method: GET 
Request URL: http://127.0.0.1:8000/admin/ 

Django Version: 1.6.2 
Python Version: 2.7.3 
Installed Applications: 
('django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'users') 
Installed Middleware: 
('django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware') 


Traceback: 
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response 
    101.     resolver_match = resolver.resolve(request.path_info) 
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in resolve 
    318.    for pattern in self.url_patterns: 
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in url_patterns 
    346.   patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) 
File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py" in urlconf_module 
    341.    self._urlconf_module = import_module(self.urlconf_name) 
File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py" in import_module 
    40.   __import__(name) 
File "/home/jaskaran/coding/buyingiq/authentication/authentication/urls.py" in <module> 
    4. admin.autodiscover() 
File "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/__init__.py" in autodiscover 
    29.    import_module('%s.admin' % app) 
File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py" in import_module 
    40.   __import__(name) 
File "/home/jaskaran/coding/buyingiq/authentication/users/admin.py" in <module> 
    36. class UserChangeForm(forms.ModelForm): 
File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py" in __new__ 
    292.     raise FieldError(message) 

Exception Type: FieldError at /admin/ 
Exception Value: Unknown field(s) (added_on) specified for UserProfile 

Trả lời

44

Vấn đề của bạn là auto_now_add=True về lĩnh vực đó. Xem các ghi chú trên documentation for DateField:

Lưu ý rằng ngày hiện tại là luôn sử dụng; đó không chỉ là giá trị mặc định mà bạn có thể ghi đè.

Như hiện triển khai, thiết auto_now hoặc auto_now_add-True sẽ gây ra hiện trường để có editable=Falseblank=True bộ.

Vì có thể chỉnh sửa = Sai, bạn không thể đưa nó vào danh sách trường cho biểu mẫu đó (bạn có thể đặt nó trong readonly_fields, tất nhiên).

Nếu bạn muốn giá trị để có những ngày tạo như một mặc định, nhưng vẫn cho phép nó để được chỉnh sửa và ghi đè, bạn nên sử dụng default thay vì:

added_on = models.DateTimeField(default=datetime.datetime.now) 

(mặt lưu ý, bạn nên luôn luôn sử dụng có thể gọi cho giá trị mặc định, không có dấu ngoặc đơn gọi).

+5

để hiển thị trường auto_now_add (chỉ đọc) trong quản trị viên, bạn phải thêm trường đó vào cả hai trường readnd của trường read_only_field. – wardk

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