Django上的外键错误

时间:2018-02-13 19:05:46

标签: python django django-admin models

所以我正在尝试创建一个与此图像类似的内联集(http://oi48.tinypic.com/4gm5w2.jpg),这样我就可以为产品添加不同尺寸的多个价格。我甚至无法在django admin中显示该区域。最重要的是,我得到了错误:

<class 'apps.main.admin.PriceInline'>: (admin.E202) 'main.Apparel_Price' has no ForeignKey to 'main.Apparel_Price'.

models.py:

@python_2_unicode_compatible
class Apparel_Product(models.Model):
    product_name = models.CharField(_("Name"), max_length=255)
default='media/None/no-img.jpg')
        product_gender_type = models.CharField(max_length=256, choices=[('male', 'Male'), ('female', 'Female'), ('unisex', 'Unisex')])
        product_brand = models.CharField(_("Brand"),max_length=25)
        product_sizes = models.CharField(_("Sizes"),max_length=25)
        product_colors = models.CharField(_("Colors"),max_length=25)
        product_price = models.CharField(_("Price"),max_length=10)
        product_description = models.CharField(_("Description"),max_length=500)
        product_shipping_options = models.CharField(_("Shipping Options"),max_length=250)
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)

        class Meta:
            verbose_name = _("Apparel Product")
            verbose_name_plural = _("Apparel Products")

        def __str__(self):
            return self.album_name


    @python_2_unicode_compatible
    class Apparel_Picture(models.Model):
        master_apparel_product = models.ForeignKey(Apparel_Product, verbose_name=_("Apparel Product"), on_delete=models.CASCADE)
        product_caption = models.CharField(_("Caption"), max_length=255)
        product_photo = models.ImageField(_("Picture"), upload_to='media/')
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)

        class Meta:
            verbose_name = _("Picture")
            verbose_name_plural = _("Pictures")

        def __str__(self):
            return self.photo_caption

    @python_2_unicode_compatible
    class Apparel_Price(models.Model):
        # master_apparel_product = models.ForeignKey(Apparel_Product, verbose_name=_("Apparel Product"), on_delete=models.CASCADE)
        master_apparel_product = models.OneToOneField(Apparel_Product, verbose_name=_("Apparel Product"), on_delete=models.CASCADE)
        product_price = models.CharField(_("Price"), max_length=255)
        product_size = models.ForeignKey(Apparel_Product, verbose_name=_("Apparel Product"), on_delete=models.CASCADE)  
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)

        class Meta:
            verbose_name = _("Price")
            verbose_name_plural = _("Prices")

        def __str__(self):
            return self.product_price

admin.py:

from django.contrib import admin
from .models import Apparel_Product, Apparel_Picture, Apparel_Price

# Register your models here.
def get_picture_preview(obj):
    if obj.pk:  # if object has already been saved and has a primary key, show picture preview
        return """<a href="{src}" target="_blank"><img src="{src}" alt="{title}" style="max-width: 200px; max-height: 200px;" /></a>""".format(
            src=obj.photo.url,
            title=obj.photo_caption,
        )
    return ("(choose a picture and save and continue editing to see the preview)")
get_picture_preview.allow_tags = True
get_picture_preview.short_description = ("Picture Preview")


class PictureInline(admin.StackedInline):
    model = Apparel_Picture
    extra = 0
    fields = ["get_edit_link", "product_caption", "product_photo", get_picture_preview]
    readonly_fields = ["get_edit_link", get_picture_preview]

    def get_edit_link(self, obj=None):
        if obj.pk:  # if object has already been saved and has a primary key, show link to it
            url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.model_name), args=[force_text(obj.pk)])
            return """<a href="{url}">{text}</a>""".format(
                url=url,
                text=_("Edit this %s separately") % obj._meta.verbose_name,
            )
        return ("(save and continue editing to create a link)")
    get_edit_link.short_description = ("Edit link")
    get_edit_link.allow_tags = True

class PriceInline(admin.TabularInline):
    model = Apparel_Price
    extra = 0
    fields = ["price",]


@admin.register(Apparel_Product)
class Apparel_ProductAdmin(admin.ModelAdmin):
    save_on_top = True
    fields = ["product_name", "product_gender_type", "product_brand", "product_sizes", "product_colors", "product_price", "product_description", "product_shipping_options",]
    inlines = [PictureInline]

@admin.register(Apparel_Picture)
class Apparel_PictureAdmin(admin.ModelAdmin):
    save_on_top = True
    fields = ["master_apparel_product", "product_caption", "product_photo", get_picture_preview]
    readonly_fields = [get_picture_preview]

@admin.register(Apparel_Price)
class Apparel_PriceAdmin(admin.ModelAdmin):
    save_on_top = True
    fields = ["master_apparel_product", "product_price",]
    inlines = [PriceInline,]

所以我真的很困惑main.Apparel_Price需要一个外键给自己。图片的工作,但价格的那个没有,我试图复制它们,它没有用。非常感谢帮助。

1 个答案:

答案 0 :(得分:0)

PriceInline的模型Apparel_PriceApparel_PriceAdmin相同。只需在PriceInline中使用Apparel_ProductAdmin作为内联。