简体   繁体   中英

Can't inline User fields to UserProfile admin tab - 'auth.User' has no ForeignKey to 'MyApp.UserProfile'

I'm trying to add User fields into User Profile admin tab to be able to change every User attribute in one tab. The problem is that the cmd returns:

EDIT: Edited code according to Shang Wang's comment but still raises error:

<class 'MyApp.admin.UserProfileUserInline'>: (admin.E202) 'auth.User' has no ForeignKey to 'MyApp.UserProfile'.

In fact, I want to have either User inlined in UserProfile or UserProfile in User. The problem is that UserProfile has field language (note that this is not a Language model) which is through-model and I can't figure out how to inline it into the User (UserProfile can be inlined without problems), so I'm trying to inline User into UserProfile.

Admin.py:

from django.contrib import admin
from models import *
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
admin.site.register(AdminContact)

class UserProfileInline(admin.StackedInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = 'User_Profile'
    readonly_fields  = ('languages',)

class UserProfileLanguageLevelInline(admin.TabularInline):
    model = UserProfileLanguage

class UserAdmin(BaseUserAdmin):
    inlines = (UserProfileInline, )

class UserProfileUserInline(admin.StackedInline):
    model = User

class UserProfileAdmin(admin.ModelAdmin):
    inlines = (UserProfileLanguageLevelInline,User,)

admin.site.unregister(User)
admin.site.register(User,UserAdmin)
admin.site.register(LanguageTuple)
admin.site.register(Language)
admin.site.register(Job)
admin.site.register(UserProfileLanguage)
admin.site.register(Level)
admin.site.register(UserProfile,UserProfileAdmin)

Models.py:

from __future__ import unicode_literals
from django.contrib.auth.models import User
from django.db import models

class AdminContact(models.Model):
    email = models.EmailField()
    telephone = models.CharField(max_length=40)

    def __unicode__(self):
        return self.email

class Language(models.Model):
    shortcut = models.CharField(max_length=40)
    name = models.CharField(max_length=40)

    def __str__(self):
        return self.name


class LanguageTuple(models.Model):
    language_from = models.ForeignKey(Language, related_name='language_from', null=True)
    language_to = models.ForeignKey(Language, related_name='language_to', null=True)

    def __str__(self):
        return '{} to {}'.format(self.language_from, self.language_to)


class Level(models.Model):
    LEVEL_CHOICES = (
        ('unknown','Unknown'),
        ('standard','Standard level'),
        ('professional','Professional level'),
        ('native','Native speaker level'),
    )
    name = models.CharField(max_length=40,choices=LEVEL_CHOICES, blank=False, null=False)
    price_multiplier = models.FloatField()

    def __str__(self):
        return self.get_name_display()


class UserProfile(models.Model):
    user = models.OneToOneField(User, related_name='userprofile')
    date_of_birth = models.DateField(null=True,blank=True)
    telephone = models.CharField(max_length=40,null=True,blank=True)
    IBAN = models.CharField(max_length=40,null=True,blank=True)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)


    MARITAL_STATUS_CHOICES = (
        ('single', 'Single'),
        ('married', 'Married'),
        ('separated', 'Separated'),
        ('divorced', 'Divorced'),
        ('widowed', 'Widowed'),
    )
    marital_status = models.CharField(max_length=40, choices=MARITAL_STATUS_CHOICES, null=True, blank=True)

    HOW_DO_YOU_KNOW_ABOUT_US_CHOICES = (
        ('coincidence', u'It was coincidence'),
        ('relative_or_friends', 'From my relatives or friends'),
    )
    how_do_you_know_about_us = models.CharField(max_length=40, choices=HOW_DO_YOU_KNOW_ABOUT_US_CHOICES, null=True,
                                                blank=True)

    # TRANSLATOR ATTRIBUTES

    is_translator = models.BooleanField(default=False)

    # language_tuples = models.ManyToManyField(LanguageTuple,blank=True)
    languages = models.ManyToManyField(Language, through='UserProfileLanguage')

    rating = models.IntegerField(default=0)

    number_of_ratings = models.BigIntegerField(default=0)

    def __unicode__(self):
        return '{} {}'.format(self.user.first_name, self.user.last_name)

    def __str__(self):
        return '{} {}'.format(self.user.first_name, self.user.last_name)

class UserProfileLanguage(models.Model):
    userprofile = models.ForeignKey(UserProfile)
    language = models.ForeignKey(Language)
    level = models.ForeignKey(Level)

    class Meta:
        unique_together = (('userprofile', 'language'),)


class Job(models.Model):
    customer = models.ForeignKey(User, related_name='orders')
    translator = models.ForeignKey(User, related_name='jobs',null=True)
    price = models.FloatField(null=True,blank=True)

    # ZADAVA CUSTOMER
    description = models.TextField()
    file = models.FileField(null=True,blank=True)
    language_tuple = models.ForeignKey(LanguageTuple,related_name='jobs')
    specialist = models.BooleanField(blank=True)

    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    is_active = models.BooleanField(default=False)

    is_done = models.BooleanField(default=False)

    @property
    def has_translator(self):
        return self.translator_id is not None


    def __str__(self):
        return '{}: {}'.format(self.customer,self.language_tuple)

You shouldn't have User model in inlines for UserProfileAdmin , because User is a model not an inline admin. Edit it like this:

class UserProfileAdmin(admin.ModelAdmin):
    inlines = (UserProfileLanguageLevelInline, UserProfileUserInline)

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