2014-07-01 3 views
1

Je tire mes cheveux avec ça. Lorsque j'essaie d'ajouter un 'Product' depuis ma page d'administration, j'obtiens une IntegrityError: main_product.img peut ne pas être NULL.IntegrityError: peut ne pas être NULL

Models.py

class Product(models.Model): 
    name = models.CharField(max_length=500) 
    short = models.CharField(max_length=250) 
    description = models.TextField() 
    price = models.DecimalField(max_digits=8, decimal_places=2) 
    in_stock = models.BooleanField() 

    def __unicode__(self): 
     return self.name 

class ProductImages(models.Model): 
    product = models.ForeignKey(Product, blank=True) 
    img = models.ImageField(upload_to='images', blank=True) 
    caption = models.CharField(max_length=300, blank=True) 

class ProductFeatures(models.Model): 
    product = models.ForeignKey(Product) 
    feature = models.CharField(max_length=500) 

Admin.py

class ProductFeaturesAdmin(admin.TabularInline): 
    model = ProductFeatures 
    extra = 1 

class ProductImageAdmin(admin.TabularInline): 
    model = ProductImages 
    extra = 1 

class ProductAdmin(admin.ModelAdmin): 
    list_display = ('name', 'price', 'in_stock') 
    inlines = [ProductFeaturesAdmin, ProductImageAdmin] 
admin.site.register(Product,ProductAdmin) 

j'utilisais oreiller pour redimensionner les images lors être téléchargement, donc j'avais une fonction d'enregistrement personnalisé() dans mon modèle images de produits. J'ai enlevé cela en pensant que c'était le problème, mais ça ne marche toujours pas. Comme vous pouvez le constater, je suis vraiment nouveau sur Django et Python. Toute aide a été appréciée.

Édition: j'ai oublié de mentionner que j'ai ajouté blank = true et null = true à Product.img, puis j'ai utilisé South pour migrer la table.

Éditer 2: Ceci est mon nouveau modèle ProductImages.

class ProductImages(models.Model): 
    product = models.ForeignKey(Product) 
    img = models.ImageField(upload_to='images', blank=True, null=True) 
    caption = models.CharField(max_length=300, blank=True) 

J'utilisé du Sud et a couru:

python manage.py schemamigration main --auto 
python manage.py migrate main 

ayant toujours l'erreur. Si je devais ajouter le champ img à mon modèle Products, comment pourrais-je ajouter plusieurs imgs dans le panneau d'administration?

+0

Je ne vois pas 'img' dans le modèle' Product'. – furas

+0

Avec ProductImages lié au produit, le ProductImages.img ne deviendrait-il pas Product.img? –

+0

img devrait être un attribut direct dans Product, sinon ce serait quelque chose comme main_productimages.img. Wild suppose que vous avez initialement img dans le modèle de produit plus tard, il a changé de modèle, mais n'a pas fait de migrations de base de données. – jtiai

Répondre

2

En fait, vous devez ajouter null=True dans le champ img, Alors faites-le img = models.ImageField(upload_to='images', blank=True, null=True). La différence est que parce que blank=True décide que les champs seront requis par les formulaires. blank=False signifie que ce champ ne peut pas être vide et blank=True signifie que le champ ne sera pas requis. En ce qui concerne null=True définit NULL dans la colonne de votre base de données qui va résoudre votre problème.

+0

Ajouter blank = True est suffisant - L'implémentation sous-jacente de ImageField est CharField et il est conseillé de ne pas utiliser null = True pour CharFields. – jtiai

+0

J'ai essayé d'enlever blank = True et d'ajouter null = True. J'ai essayé d'ajouter les deux. Je migre la base de données et je n'arrive toujours pas à la faire fonctionner. J'aimerais vraiment que cela fonctionne sans avoir à supprimer ma base de données et recommencer à zéro. –

+0

Pouvez-vous accéder à DB avec phpmyadmin? vous devez supprimer la contrainte 'not null' de la base de données manuellement si possible. voir si cela fonctionne –

Questions connexes