__str__ returned non-string (type Category). when I add post from admin

Viewed 287

After I added user and date_added in the Photo models, when I add post from admin its throws me an error saying: str returned non-string (type Category), when I click on the addpost link in the home template its throw another error: 'tuple' object has no attribute 'name'. how can I solve that ?

the models.py:

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

# Create your models here.

class Category(models.Model):
    name = models.CharField(max_length=100, null=False, blank=False)

    def __str__(self):
        return self.name

class Photo(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, 
    blank=True)
    image = CloudinaryField('image')
    description = models.TextField(null=True)
    date_added = models.DateTimeField(auto_now_add=True)


    def __str__(self):
        return self.category

the view.py file:

def home(request):
    category = request.GET.get('category')
    if category == None:
        photos = Photo.objects.all()
    else:
        photos = Photo.objects.filter(category__name=category)
  
    categories = Category.objects.all()
    context = {'categories': categories, 'photos': photos}
    return render(request, 'home.html', {'categories': categories, 'photos': photos} )


def viewPhoto(request, pk):
    photo = Photo.objects.get(id=pk)
    return render(request, 'photo.html', {'phpto': photo})



class PostCreativeView(LoginRequiredMixin, CreateView):
    model = Photo, Category
    fields = ['description', 'image', 'category', 'name']
    template_name = 'post_create.html'


    def form_valid(self, form):
        form.instance.user = self.request.user
        return super (PostCreativeView, self).form_valid(form)
2 Answers

You should return the str(…) of the category, so:

class Photo(models.Model):
    # …
    
    def __str__(self):
        return str(self.category)

Well it has to do with your category name and model you added into post create view.py and so you have do something like this:

views.py

class PostCreativeView(LoginRequiredMixin, CreateView):
    model = Photo
    fields = ['description', 'image', 'category']
    template_name = 'post_create.html'
    
    def form_valid(self, form):
        form.instance.user = self.request.user
        return super (PostCreativeView, self).form_valid(form)

#.......

# Models.py 
class Photo(models.Model):
  #>>>...
    
    def __str__(self):
        return str(self.category)
Related