2016-04-11 7 views
1

Ich versuche, Benutzerfelder in User Profile Admin-Registerkarte hinzufügen, um in der Lage sein, jedes Benutzerattribut zu ändern eine Registerkarte. Das Problem ist, dass die cmd kehrt:Kann nicht inline Benutzerfelder zu UserProfile Admin Registerkarte - 'auth.User' hat keine ForeignKey zu 'MyApp.UserProfile'

EDIT: Edited Code Shang Wang Kommentar nach, aber immer noch Fehler auslöst:

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

In der Tat, ich möchte Benutzer haben entweder Benutzer inlined in Userprofile oder Userprofile. Das Problem ist, dass UserProfile Feld language hat (beachten Sie, dass dies kein Sprachmodell ist), das ist through-model und ich kann nicht herausfinden, wie man es in den Benutzer einbinden (UserProfile kann ohne Probleme inlinelined sein), also versuche ich Inline-Benutzer in 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) 

Antwort

0

Sie sollten nicht User Modell in inlines für UserProfileAdmin haben, weil User ein Modell ist nicht ein Inline-Admin. Bearbeiten Sie es wie folgt aus:

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

Danke, aber jetzt wirft es Fehler: : (admin.E202) 'au th.User' keine ForeignKey hat zu 'SolutionsForLanguagesApp.UserProfile' . –

+0

Ich bin mir nicht sicher, aber ich denke, Sie erstellt zu viele Beziehungen voneinander abhängig, wie Sie 'UserInline' in' UserProfile' haben, und Sie haben 'UserProfileInline' in' User', was ich denke, dass es nicht notwendig ist. Ich denke, Sie sollten 'UserAdmin' beibehalten und' userfile' als Inline dafür haben. –

Verwandte Themen