NameError: имя 'ProductTag' не определено - PullRequest
0 голосов
/ 03 апреля 2020

models.py

     from django.db import models
     from django.contrib.auth.models import User
     class ActiveManager(models.Model):
         def active(self):
           return self.filter(active=True)
     class Product(models.Model):
        name = models.CharField(max_length=32)
        description = models.TextField(blank=True)
        price = models.DecimalField(max_digits = 5, decimal_places = 2) 
        slug = models.SlugField(max_length=48)
        active = models.BooleanField(default=True)
        in_stock = models.BooleanField(default=True)
        date_updated = models.DateTimeField(auto_now=True)
        objects = ActiveManager()
        tags = models.ManyToManyField(ProductTag, blank=True)
        def __str__(self):
            return self.name

        class ProductImage(models.Model):
            product = models.ForeignKey(
               Product, on_delete=models.CASCADE)
            image = models.ImageField(upload_to="product-images")
            thumbnail = models.ImageField(
            upload_to="product-thumbnails", null=True)

     class ProductTag(models.Model):
     name = models.CharField(max_length=40)
     slug = models.SlugField(max_length=48)
     description = models.TextField(blank=True)
     active = models.BooleanField(default=True)
     def __str__(self):
         return self.name
     def natural_key(self):
         return(self.slug,)

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

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Решение должно быть таким, потому что я думаю, что переупорядочение может решить вашу проблему. Однако, пожалуйста, поместите 2 строки между вашими классами и 1 строку между вашими функциями. Это может сделать ваш код более читабельным, а также более подходящим для Python рекомендаций.

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


 class ActiveManager(models.Model):
     def active(self):
       return self.filter(active=True)


 class ProductTag(models.Model):
 name = models.CharField(max_length=40)
 slug = models.SlugField(max_length=48)
 description = models.TextField(blank=True)
 active = models.BooleanField(default=True)
 def __str__(self):
     return self.name
 def natural_key(self):
     return(self.slug,)


 class Product(models.Model):
    name = models.CharField(max_length=32)
    description = models.TextField(blank=True)
    price = models.DecimalField(max_digits = 5, decimal_places = 2) 
    slug = models.SlugField(max_length=48)
    active = models.BooleanField(default=True)
    in_stock = models.BooleanField(default=True)
    date_updated = models.DateTimeField(auto_now=True)
    objects = ActiveManager()
    tags = models.ManyToManyField(ProductTag, blank=True)
    def __str__(self):
        return self.name


    class ProductImage(models.Model):
        product = models.ForeignKey(
           Product, on_delete=models.CASCADE)
        image = models.ImageField(upload_to="product-images")
        thumbnail = models.ImageField(
        upload_to="product-thumbnails", null=True)
0 голосов
/ 03 апреля 2020

Глядя на свой код, вы пытаетесь использовать ProductTag до того, как определили его.

Вы можете либо изменить порядок вещей, либо я считаю, что вы можете ссылаться на строку, и django свяжет их потом.

Например tags = models.ManyToManyField('ProductTag', blank=True)

...