简体   繁体   中英

Django Admin Won't Show Fields

In the Django Admin on my live website, the form to edit some models is blank. There should be fields appearing under the yellow bar:

例

For some reason, this only affects two models (User and Job), and the other models work fine. The fields on the affected models also appear when testing the website on my local testing server. Here is my 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)

I have done migrations one my server with the commands:

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

I have also restarted my server, and the admin.py file is up to date. I am using django 1.8.5, apache 2.4, and MySQL Does anyone know the cause of the issue? Has anyone had the issue before or know how to fix it?

Edit (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

I also included the Address model because both of the affected models have a ForeignKey to Address.

I set Debug to True, and there was a UnicodeError. The issue was some foreign users signed up, and used non-English characters in their addresses. When the User model accessed these addresses, the admin threw the UnicodeError. The solution is to remove any rows from any table that users have entered foreign characters into, and validate that users only enter allowed characters into forms in the future.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM