Найти - Пользователи
Полная версия: Поле django-mptt в Admin list_editable
Начало » Django » Поле django-mptt в Admin list_editable
1
pyOut
Подскажите как отоброзить в древовидном виде поле django-mptt в list_editable админки.
models.py:
class ProductCategory(MPTTModel):
    name = models.CharField(_(u'Название'), max_length=255)
    slug = models.SlugField(u'Slug', max_length=255)
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children', verbose_name=_(u'Родительская категория'))
    class MPTTMeta:
        order_insertion_by = ['name']
    class Meta:
        db_table = 'product_category'
        verbose_name = _(u'Категория')
        verbose_name_plural = _(u'Категории')
    def __unicode__(self):
        return self.name
class Product(models.Model):
    name = models.CharField(_(u'Название'), max_length=255)
    slug = AutoSlugField(populate_from='name', editable=True)
    category = models.ForeignKey(ProductCategory, related_name='category_products', verbose_name=_(u'Категория'), blank=True, null=True, default=None)
    created = models.DateTimeField(_(u'Создан'), auto_now_add=True, editable=False)
    description = models.TextField(_(u'Описание'), null=True, blank=True)
    def __unicode__(self):
        return self.name

forms.py
class ProductForm(forms.ModelForm): 
    category = TreeNodeChoiceField(label=_(u'Категория'), queryset=ProductCategory.objects.all()) 

admin.py
class ProductAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('name',)}
    list_display = [
        'name', 'description_html', 'category', 'status', 'created']
    list_editable = ['category', 'status']
    list_filter = ['status']
    search_fields = ['name']
    form = ProductForm 
    def description_html(self, obj):
        return obj.description
    description_html.short_description = u'Описание'
    description_html.allow_tags = True

При таком подходе оно отображается в древовидном виде только при переходе на страницу продукта в админке, а вот на странице при отображении списком оно отображается в обычном виде. Подскажите как пофиксить такое?
alafin
В ProductAdmin добавить метод formfield_for_foreignkey:
class ProductAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('name',)}
    list_display = [
        'name', 'description_html', 'category', 'status', 'created']
    list_editable = ['category', 'status']
    list_filter = ['status']
    search_fields = ['name']
    
    form = ProductForm
    
    def description_html(self, obj):
        return obj.description
    description_html.short_description = u'Описание'
    description_html.allow_tags = True
    
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        from mptt.models import MPTTModel, TreeForeignKey
        if issubclass(db_field.rel.to, MPTTModel) \
                and not isinstance(db_field, TreeForeignKey) \
                and not db_field.name in self.raw_id_fields:
            defaults = dict(form_class=TreeNodeChoiceField, queryset=db_field.rel.to.objects.all(), required=False)
            defaults.update(kwargs)
            kwargs = defaults
        return super(ProductAdmin, self).formfield_for_foreignkey(db_field,
                                                                    request,
                                                                    **kwargs)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB