【问题标题】:How to display django category name instead of Category object (1)如何显示django类别名称而不是Category对象(一)
【发布时间】:2020-03-05 03:52:06
【问题描述】:

这就是问题所在。我在我的 django 博客中添加了一个类别部分。当我尝试添加新类别时,用户本地化存在问题。当我添加类别时,例如 django,它显示如下: image 1

在管理面板中相同: image 2

但我实际上添加了一个普通的类别名称: image 3

有趣的是,当我在我的网络应用中发布带有 category 的内容后,它看起来很正常: image 4

我想要这样的东西,也许有人有解决方案:wanted result

一些代码:

models.py

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    categories = models.ManyToManyField('Category', related_name='posts')
    image = models.ImageField(upload_to='images', default="images/None/no-img.jpg")



    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})


class Category(models.Model):
    name = models.CharField(max_length=20)

views.py

from django.shortcuts import render, get_object_or_404
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from .models import Post
from django.contrib.auth.models import User
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView


def home(request):
    content = {
        'posts': Post.objects.all()
    }

    return render(request, 'blog/home.html', content)

def blog_category(request, category):
    posts = Post.objects.filter(categories__name__contains=category).order_by('-date_posted')
    content = {
        'category': category,
        'posts': posts
    }
    return render(request, 'blog/blog_category.html', content) #<--(didn't add content block) bug found 05.11.19

def upload_pic(request):
    if request.method == 'POST':
        form = ImageUploadForm(request.POST, request.FILES)
        if form.is_valid():
            m = ExampleModel.objects.get(pk=course_id)
            m.model_pic = form.cleaned_data['image']
            m.save()
            return HttpResponse('image upload success')
    return HttpResponseForbidden('allowed only via POST')

class PostListView(ListView):
    model = Post
    template_name = 'blog/home.html'
    context_object_name = 'posts'
    ordering = ['-date_posted']
    paginate_by = 5

class UserPostListView(ListView):
    model = Post
    template_name = 'blog/user_posts.html'
    context_object_name = 'posts'
    ordering = ['-date_posted']
    paginate_by = 5

    def get_queryset(self):
        user = get_object_or_404(User, username=self.kwargs.get('username'))
        return Post.objects.filter(author=user).order_by('-date_posted')


class PostDetailView(DetailView):
    model = Post

class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['title', 'content', 'categories', 'image']

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)


class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Post
    fields = ['title', 'content', 'categories', 'image']

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author: #checking if it's trully the same author who has created the post
            return True
        return False

类别部分

  <div>
          <!-- category section -->
          <small class="text-muted">
            Categories:&nbsp;
            {% for category in post.categories.all %}
            <a href="{% url 'blog_category' category.name %}">
              {{ category.name }}
            </a>&nbsp;
            {% endfor %}
          </small>
        </div>

【问题讨论】:

标签: python django django-models django-views django-admin


【解决方案1】:

您实现了Category 类的__str__ 方法:

class Category(models.Model):
    name = models.CharField(max_length=20)

    def __str__(self):
        return self.name

【讨论】:

    猜你喜欢
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多