2017-01-26 5 views
0

От models.pyДжанго InlineModelAdmin дает объект ошибки '' MediaDefiningClass не итерацию

class Indicator(models.Model): 
    name = models.CharField(max_length=50) 
    youtube = models.CharField(max_length=LONG_BLOG_POST_CHAR_LEN) 
    description = models.CharField(max_length=LONG_BLOG_POST_CHAR_LEN)  
    recommendation = models.CharField(max_length=LONG_BLOG_POST_CHAR_LEN) 
    isPublic = models.BooleanField(default=False) 
    methods_path = models.CharField(max_length=100,default=None) 
    meta_description = models.CharField(max_length=150,default='') 
    image_path = models.CharField(max_length=100,blank=True) 

    def __str__(self): 
     return self.name 

class IndicatorParameterInt(models.Model): 
    name = models.CharField(max_length=50) 
    value = models.IntegerField(default=1) 
    indicator_int_parameter = models.ForeignKey(Indicator, on_delete=models.CASCADE) 
    hidden = models.BooleanField(default=False) 

class IndicatorParameterFloat(models.Model): 
    name = models.CharField(max_length=50) 
    setting = models.FloatField(default=1) 
    indicator_float_parameter = models.ForeignKey(Indicator, on_delete=models.CASCADE) 
    hidden = models.BooleanField(default=False) 

class Comparison(models.Model): 
    name = models.CharField(max_length=100) 

От admin.py

from django.contrib import admin 
from .models import * 

# Register your models here. 
admin.site.register(MarketData) 
admin.site.register(Indicator) 
admin.site.register(UserProfile) 



class IndicatorParameterIntInline(admin.TabularInline): 
    model = IndicatorParameterInt 
    fk_name = "indicator_int_parameter" 

class IndicatorParameterFloatInline(admin.TabularInline): 
    model = IndicatorParameterFloat 
    fk_name = "indicator_float_parameter" 

class ComparisonInline(admin.TabularInline): 
    model = Comparison 
    fk_name = "Comparison" 

class IndicatorInline(admin.ModelAdmin): 
    inlines = [ 
       IndicatorParameterIntInline, 
       IndicatorParameterFloatInline, 
       ComparisonInline, 
       ] 

admin.site.unregister(Indicator) 
admin.site.register(IndicatorInline) 

Ошибка TypeError: объект '' MediaDefiningClass не итерацию приходит вверх по последней строке администратора: admin.site.register (IndicatorInline). Не имеет значения, пытаюсь ли я сначала регистрировать IndicatorInline или любой из классов внешнего ключа.

Я ссылался на this post, что поощряло использование атрибута fk_name. Ошибка возникает независимо от того, использую ли я fk_name.

ответ

2

Прежде всего, постарайтесь не использовать import * - всегда импортируйте модель, которую вы используете.

Далее, я думаю, что изменение этого должно быть достаточно

from django.contrib import admin 
from .models import * 





class IndicatorParameterIntInline(admin.TabularInline): 
    model = IndicatorParameterInt 
    fk_name = "indicator_int_parameter" 

class IndicatorParameterFloatInline(admin.TabularInline): 
    model = IndicatorParameterFloat 
    fk_name = "indicator_float_parameter" 

class ComparisonInline(admin.TabularInline): 
    model = Comparison 
    fk_name = "Comparison" 

class IndicatorInline(admin.ModelAdmin): 
    inlines = [ 
       IndicatorParameterIntInline, 
       IndicatorParameterFloatInline, 
       ComparisonInline, 
       ] 

admin.site.register(Indicator, IndicatorInline) 
admin.site.register(MarketData,) 
admin.site.register(UserProfile,) 
+0

Спасибо! Почему регистрация модели и встроенного класса вместе - единственный способ сделать ее счастливой? –

+1

Вам всегда нужно регистрировать свою модель с помощью модели администратора. Вот как вы сообщаете своему администратору django, что он должен использовать этот конкретный ModelAdmin. Потому что, как вы можете видеть, у вас нет информации о модели в вашем IndicatorInline. – sebb

1

Вам необходимо указать модель при регистрации класса модели администратора.

admin.site.register(Indicator, IndicatorInline) 

Обратите внимание, что если вы удалите admin.site.register(Indicator) из верхней части модуля, то вам не придется звонить admin.site.unregister(Indicator) позже.

Я бы предложил переименование IndicatorInline - это администратор модели, который имеет встроенные линии, поэтому было бы лучше назвать его IndicatorAdmin. В этом случае вы зарегистрируете его с помощью:

admin.site.register(Indicator, IndicatorAdmin) 
+0

Пятно, это сработало для меня. В противоположность django docs. – surfer190

+0

@ surfer190 Я не уверен, что вы имеете в виду. Этот ответ не должен конфликтовать с документами Django. – Alasdair

+1

Ahh моя ошибка. Документы, и вы правы. Благодарю. – surfer190