Django管理界面不显示字段

3
在我的实际网站上,Django管理界面中编辑某些模型的表单是空白的。黄色条下应该出现字段:

Example

由于某些原因,这只影响了两个模型(User和Job),而其他模型正常工作。在本地测试服务器上测试网站时,受影响模型上的字段也出现了。以下是我的admin.py:

from django.contrib import admin
from web.models import Address, User, WorkerProfile, EmployerProfile, Job, SupportIssue, LoginCode, ReferredEmail, InArea, AdminEmail
from django.contrib.auth.models import Group

class AddressAdmin(admin.ModelAdmin):
    search_fields = ('name', 'zip',)

class UserAdmin(admin.ModelAdmin):
    search_fields = ('email', 'phone', 'role', 'address__zip',)
    exclude = ('birthday', 'password', 'last_login',  'is_active',)

class WorkerProfileAdmin(admin.ModelAdmin):
    search_fields = ('user__email', 'user__phone', 'user__address__zip',)

class EmployerProfileAdmin(admin.ModelAdmin):
    search_fields = ('user__email', 'user__phone', 'user__address__zip',)

class JobAdmin(admin.ModelAdmin):
    search_fields = ('employer__user__email', 'employer__user__phone', 'worker__user__email', 'worker__user__phone', 'title', 'address__zip',)
    exclude = ('is_hired', 'is_completed', 'employer_is_reviewed',)

class SupportIssueAdmin(admin.ModelAdmin):
    search_fields = ('email',)

class LoginCodeAdmin(admin.ModelAdmin):
    search_fields = ('email',)

class ReferredEmailAdmin(admin.ModelAdmin):
    search_fields = ('email', 'user__email',)

class InAreaAdmin(admin.ModelAdmin):
    search_fields = ('email', 'state',)

class AdminEmailAdmin(admin.ModelAdmin):
    search_fields = ('filter_value', 'subject', 'date',)

admin.site.register(Address, AddressAdmin)
admin.site.register(User, UserAdmin)
admin.site.register(WorkerProfile, WorkerProfileAdmin)
admin.site.register(EmployerProfile, EmployerProfileAdmin)
admin.site.register(Job, JobAdmin)
admin.site.register(SupportIssue, SupportIssueAdmin)
admin.site.register(LoginCode, LoginCodeAdmin)
admin.site.register(ReferredEmail, ReferredEmailAdmin)
admin.site.register(InArea, InAreaAdmin)
admin.site.register(AdminEmail, AdminEmailAdmin)

admin.site.unregister(Group)

我已经使用以下命令在我的服务器上执行了迁移:

python manage.py makemigrations APPNAME
python manage.py migrate
python manage.py syncdb

我已经重新启动了服务器,而且admin.py文件也是最新的。我正在使用django 1.8.5、apache 2.4和MySQL。有人知道这个问题的原因吗?有人之前遇到过这个问题或者知道如何解决吗?
编辑(models.py):
class Address(models.Model):
    state_choices = (
        ('OH', 'Ohio'),
    )

    name = models.CharField(max_length=255, verbose_name='Name')
    street = models.CharField(max_length=255, verbose_name='Street Address')
    city = models.CharField(max_length=31, verbose_name='City')
    state = models.CharField(max_length=255, choices=state_choices, verbose_name='State')
    zip = models.CharField(validators=[MinLengthValidator(5)], max_length=5, verbose_name='Zip Code')

    def __str__ (self):
        return self.name + ' ' + self.street + ' ' + self.city + ' ' + self.state + ' ' + self.zip

class UserManager(BaseUserManager):
    def create_user(self, first_name, last_name, email, phone, role, birthday, address, password):
        user = self.model(first_name=first_name, last_name=last_name, email=email, phone=phone, role=role, birthday=birthday, address=address)
        user.set_password(password)
        user.admin_permission = False
        user.save()

        return user

    def create_superuser(self, first_name, last_name, email, phone, birthday, password, address=None):
        if not address:
            address = Address(street='', city='', state='')
            address.save()

        user = self.create_user(first_name=first_name, last_name=last_name, email=email, phone=phone, role='Worker', birthday=birthday, address=address, password=password)
        user.is_admin = True
        user.admin_permission = True
        user.save()

        return user

class User(AbstractBaseUser):
    role_choices = (
        ('Worker', 'Worker'),
        ('Employer', 'Employer'),
    )

    objects = UserManager()

    first_name = models.CharField(max_length=255, verbose_name='First Name')
    last_name = models.CharField(max_length=255, verbose_name='Last Name')
    email = models.EmailField(max_length=255, unique=True, verbose_name='Email Address')
    phone = models.CharField(validators=[MinLengthValidator(10)], max_length=10, unique=True, verbose_name='Phone Number')
    role = models.CharField(max_length=255, choices=role_choices, verbose_name='User Role')
    birthday = models.DateField(auto_now=False, null=True, verbose_name='Birthday')
    address = models.ForeignKey(Address, verbose_name='Address')
    admin_permission = models.BooleanField()
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name', 'phone', 'birthday']

    def get_full_name(self):
        return self.first_name + ' ' + self.last_name

    def get_short_name(self):
        return self.first_name

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

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

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

    def has_module_perms(self, app_label):
        return self.is_admin

    def __str__ (self):
        return self.email   

class Job(models.Model):
    wage_type_choices = (
        ('Hourly', 'Hourly'),
        ('Total', 'Total'),
    )

    employer = models.ForeignKey(EmployerProfile, verbose_name='Employer')
    address = models.ForeignKey(Address, verbose_name='Address')
    title = models.CharField(max_length=255, verbose_name='Job Title')
    description = models.TextField(blank=False, verbose_name='Job Description')
    completion_date = models.DateField(auto_now=False, auto_now_add=False, verbose_name='Completion Date', help_text='mm/dd/yyyy')
    wage_type = models.CharField(max_length=255, choices=wage_type_choices, verbose_name='Wage Type')
    wage = models.DecimalField(validators=[MinValueValidator(9)], max_digits=6, decimal_places=2, verbose_name='Wage')
    tools = models.TextField(blank=True, default='', verbose_name='Tools')
    is_hired = models.BooleanField(default=False, verbose_name='Job Is Hired')
    is_completed = models.BooleanField(default=False, verbose_name='Job Is Completed')
    employer_is_reviewed = models.BooleanField(default=False, verbose_name='Employer Is Reviewed')
    worker = models.ForeignKey(WorkerProfile, null=True, verbose_name='Worker')

    def __str__ (self):
        return self.title

我还包括了Address模型,因为受影响的两个模型都有对Address的外键。

2
Django 1.8 看起来与您发布的截图不同。看起来您正在使用一些未提及的管理皮肤。 - Alasdair
我正在使用django_admin_bootstrapped应用程序。我没有想到它会产生影响,因为它只是一个样式应用程序。感谢您指出这一点。 - Kevin
1
尝试在没有模型管理器的情况下注册模型,例如 admin.site.register(User),以查看模型管理器是否存在问题。如果仍然无法解决问题,您应该展示出现问题的模型。 - Alasdair
1
看起来字段中有一些错误。在运行服务器的输出中有什么吗?尝试为每个有问题的模型分别注释掉“search_fields”和“exclude”。 - tug
1
这个Django开发者邮件列表中的讨论帖可能涉及相同的问题。 - Alasdair
显示剩余2条评论
1个回答

1
我将Debug设置为True,出现了UnicodeError错误。问题在于一些外国用户注册时在地址中使用了非英文字符。当User模型访问这些地址时,管理员会抛出UnicodeError错误。解决方法是从任何表中删除用户输入外语字符的行,并验证用户在未来只输入允许的字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接