2016-07-06 2 views
1

Я использовать этот учебник и делать именно то, что они делают: https://docs.djangoproject.com/ja/1.9/topics/auth/customizing/#extending-the-existing-user-modelDjango модель расширения пользователь учебник не работает для меня

мой model.py:

from django.db import models 
from django.contrib.auth.models import User 
from datetime import datetime 

class Chess(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    last_activity = models.DateTimeField(default=datetime(1970,1,1,)) 
    is_avaliable = models.BooleanField(default=False,) 
    in_progress = models.BooleanField(default=False,) 

мой admin.py:

from django.contrib import admin 
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin 
from django.contrib.auth.models import User 

from chess_tournament.models import Chess 

class ChessInline(admin.StackedInline): 
    model = Chess 
    can_delete = False 
    verbose_name_plural = 'Chess' 

# Define a new User admin 
class UserAdmin(BaseUserAdmin): 
    inlines = (ChessInline,) 

# Re-register UserAdmin 
admin.site.unregister(User) 
admin.site.register(User, UserAdmin) 

в managaer.py оболочки:

from django.contrib.auth.models import User 
u = User.objects.get(pk=1) 
u.username # return 'admin' it's work 
u.chess.last_activity # return ERROR (described below) 

AttrinbuteError: «Пользователь» объект не имеет атрибута «шахматы»

  • но в Джанго панели администратора этого поля доступны и работает

Пожалуйста, помогите понять это сог я уже провел 4 часа это ...

ответ

0

Вам необходимо обновить свою модель Chess и добавить related_name в категорию user.

class Chess(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="chess_board") 
    # Other Stuff 

Теперь вы можете легко получить доступ к last_activity или любому другому свойству:

u.chess_board.last_activity 

Надеется, что это помогает.

+0

Это не поможет. Отношения уже имеют имя по умолчанию; в случае OneToOneField это младшее имя модели. 'u.chess' будет работать. –

+0

@ DanielRoseman 'u.chess' не будет работать в этом случае. Он дает объект AttributeError: 'User' не имеет атрибута 'chess''. – Aakash

+0

В описании вопроса четко написано, что 'u.chess' не работает. @ DanielRoseman, по крайней мере, попробуйте решение перед голосованием. – Aakash

0

Возможно ли, что вы не зарегистрировали шахматную модель?

Попробуйте добавить admin.site.register(Chess, ChessAdmin) в нижней части admin.py. Конечно, вам, возможно, придется сначала создать простой ChessAdmin для отображения.

+0

i din't register chess coz it wosn't в примере –

+0

Я не работаю: теперь он отображается в панели администратора django, но я не могу получить доступ к шахматам из модели пользователя –

+0

О, кажется, что Я неправильно понял вашу проблему. Наверное, вы можете видеть встроенные поля шахматной модели в User на веб-сайте, не так ли? Но ваша проблема заключается не в доступе к Chess от пользователя в оболочке. «u.chess.last_activity» кажется мне неправильным, поскольку шахматы - это модель, а не «атрибут» пользователя. Поэтому, когда вы использовали «u.Chess», это пошло не так. Мое предположение было бы «u.Chess__last_activity», двойное подчеркивание после «Шахматы». Посмотрим, сработает ли это. –